जावा लॉगिंग एपीआई का उपयोग करते हुए मैं डिफ़ॉल्ट कंसोल हैंडलर को कैसे अक्षम कर सकता हूं?


92

नमस्ते मैं अपने आवेदन में जावा लॉगिंग को लागू करने की कोशिश कर रहा हूं। मैं दो हैंडलर का इस्तेमाल करना चाहता हूं। एक फ़ाइल हैंडलर और मेरा स्वयं का कंसोल हैंडलर। मेरे दोनों हैंडलर ठीक काम करते हैं। मेरी लॉगिंग एक फ़ाइल और कंसोल को भेजी जाती है। मेरा लॉगिंग डिफ़ॉल्ट कंसोल हैंडलर को भी भेजा जाता है, जो मुझे नहीं चाहिए। यदि आप मेरा कोड चलाते हैं तो आपको कंसोल पर भेजी गई अतिरिक्त दो लाइन दिखाई देंगी। मैं डिफ़ॉल्ट कंसोल हैंडलर का उपयोग नहीं करना चाहता। क्या कोई डिफ़ॉल्ट कंसोल हैंडलर को अक्षम करना जानता है। मैं केवल अपने द्वारा बनाए गए दो हैंडलर का उपयोग करना चाहता हूं।

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

    static {
        try {
            logger.setLevel(Level.INFO);

            Formatter formatter = new Formatter() {

                @Override
                public String format(LogRecord arg0) {
                    StringBuilder b = new StringBuilder();
                    b.append(new Date());
                    b.append(" ");
                    b.append(arg0.getSourceClassName());
                    b.append(" ");
                    b.append(arg0.getSourceMethodName());
                    b.append(" ");
                    b.append(arg0.getLevel());
                    b.append(" ");
                    b.append(arg0.getMessage());
                    b.append(System.getProperty("line.separator"));
                    return b.toString();
                }

            };

            Handler fh = new FileHandler("test.txt");
            fh.setFormatter(formatter);
            logger.addHandler(fh);

            Handler ch = new ConsoleHandler();
            ch.setFormatter(formatter);
            logger.addHandler(ch);

            LogManager lm = LogManager.getLogManager();
            lm.addLogger(logger);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
    }
}

1
मैं धीरे उपयोग करने के लिए सुझाव दे सकते हैं b.append(formatMessage(arg0))के बजाय b.append(arg0.getMessage())formatMessageविधि के साथ आप उपयोग public void log(Level level, String msg, Object param1)और इसी तरह के तरीकों के साथ अपने फॉर्मेटर को संगत कर रहे हैं ।
विक्टर

जवाबों:


102

डिफ़ॉल्ट कंसोल हैंडलर रूट लॉगर से जुड़ा हुआ है, जो कि आपके सहित अन्य सभी लॉगर का एक अभिभावक है। तो मैं आपकी समस्या को हल करने के दो तरीके देखता हूं:

यदि यह केवल आपके इस विशेष वर्ग को प्रभावित करता है, तो सबसे सरल उपाय यह होगा कि लॉग को जनक लकड़हारे तक निष्क्रिय कर दिया जाए:

logger.setUseParentHandlers(false);

यदि आप अपने संपूर्ण ऐप के लिए इस व्यवहार को बदलना चाहते हैं, तो आप अपने हैंडलर को जोड़ने से पहले डिफ़ॉल्ट कंसोल हैंडलर को रूट लॉगर से पूरी तरह से हटा सकते हैं:

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

नोट: यदि आप अन्य वर्गों में भी समान लॉग हैंडलर्स का उपयोग करना चाहते हैं, तो सबसे अच्छा तरीका यह है कि लॉग कॉन्फिगरेशन को लंबे समय में एक कॉन्फिगर फाइल में ले जाएं।


2
setUseParentHandlers विधि काम करती है, धन्यवाद। मैं मूल लॉगर से डिफ़ॉल्ट कंसोल हैंडलर को कैसे निकाल सकता हूं?
जोरिइमो

10
तुम भी Logger.getLogger ("") का उपयोग कर सकते हैं - यह मेरे लिए काम करता है जहां "वैश्विक" मिश्रण में SLF4J का परिणाम नहीं हो सकता है?)
सेहुग

2
यदि आप slf4j चाहते हैं, तो मेरा सुझाव है कि आप इसका उपयोग करें LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
सोमाटिक

8
"" रूट लॉगर का पहचानकर्ता है। "ग्लोबल" एक नामित लकड़हारा (जड़ का बच्चा) है जो डिफ़ॉल्ट रूप से बनाया गया है और इसका उपयोग सरल लॉगिंग परिदृश्यों में किया जाएगा
पाओलो फुलगोनी

1
यह जवाब मेरे लिए काम नहीं करता है, लेकिन डोमिनिक द्वारा एक
BullyWiiPlaza

108

बस करो

LogManager.getLogManager().reset();

1
धन्यवाद, यह सही उत्तर है। सही के रूप में चिह्नित उत्तर, काम नहीं करता है।
एंड्रियास एल।

1
यह इंगित करना चाहिए कि यह प्रत्येक हैंडलर को हर नाम के लिए प्रभावित करेगा, Loggerइसलिए यह अधिक जटिल लॉग सिस्टम के लिए एक समस्या हो सकती है। यह प्रक्रिया की शुरुआत में एक बार कॉल किया जाना चाहिए, यह सुनिश्चित करने के लिए कि भविष्य लकड़हारा प्रभावित नहीं होगा। और निश्चित रूप से, जिसको कंसोल की आवश्यकता होगी, उसे ConsoleHandlerअपेक्षित रूप से प्राप्त करना होगा ।
एक्सलह

20

यह अजीब है लेकिन Logger.getLogger("global") मेरे सेटअप (साथ ही) में काम नहीं करता हैLogger.getLogger(Logger.GLOBAL_LOGGER_NAME) ) ।

तथापि Logger.getLogger("") काम अच्छा करता है।

आशा है कि यह जानकारी भी किसी की मदद करती है ...


3
क्या कोई हमें बता सकता है कि getLogger (Logger.GLOBAL_LOGGER_NAME) काम क्यों नहीं करता है, लेकिन getLogger ("") करता है?
डिनोशीरस


9

कॉन्फ़िगरेशन का रीसेट करें और रूट स्तर को ऑफ़ पर सेट करें

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);

5

आपको अपने लकड़हारे को अपने माता-पिता के लकड़हारे तक अपने संदेश न भेजने का निर्देश देना चाहिए:

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...

हालाँकि, यह किसी भी अधिक हैंडलर को लकड़हारे से जोड़ने से पहले किया जाना चाहिए।


यह मेरे मामले में काम करता है, हालांकि मुझे इस लकड़हारे के लिए मैन्युअल रूप से हैंडलर जोड़ना पड़ा।
सचिन गोराडे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.