在使用java logging API时,如何禁用默认控制台处理程序?

lou*_*imo 89 java java.util.logging

嗨,我正在尝试在我的应用程序中实现java日志记录.我想使用两个处理程序.文件处理程序和我自己的控制台处理程序 我的两个处理程序都运行良好.我的日志记录将发送到文件和控制台.我的日志记录也被发送到我不想要的默认控制台处理程序.如果您运行我的代码,您将看到发送到控制台的额外两行.我不想使用默认的控制台处理程序.有谁知道如何禁用默认控制台处理程序.我只想使用我创建的两个处理程序.

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);
Run Code Online (Sandbox Code Playgroud)
Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);
Run Code Online (Sandbox Code Playgroud)
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. ??");
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 105

做就是了

LogManager.getLogManager().reset();
Run Code Online (Sandbox Code Playgroud)


Pét*_*rök 101

默认控制台处理程序附加到根记录程序,它是包括您的所有其他记录程序的父记录程序.所以我看到两种解决问题的方法:

如果这仅影响您的特定类,则最简单的解决方案是禁用将日志传递到父记录器:

logger.setUseParentHandlers(false);
Run Code Online (Sandbox Code Playgroud)

如果要为整个应用程序更改此行为,可以在添加自己的处理程序之前完全从根记录器中删除默认控制台处理程序:

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

注意:如果您也想在其他类中使用相同的日志处理程序,最好的方法是从长远来看将日志配置移动到配置文件中.

  • 你也可以使用Logger.getLogger("") - 这适用于"全局"没有的地方(可能是混合中SLF4J的结果?) (10认同)
  • ""是根记录器的标识符."global"是一个名为logger(root的子),默认情况下创建,应该用于简单的日志记录方案 (8认同)
  • setUseParentHandlers方法有效,谢谢.如何从根记录器中删除默认控制台处理程序? (2认同)
  • 如果你想要slf4j,我建议你使用这个`LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();` (2认同)

Dim*_*ime 19

这很奇怪,但 Logger.getLogger("global") 在我的设置中不起作用(以及Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Logger.getLogger("")工作做得好.

希望这个信息也能帮助别人......

  • 有人可以告诉我们为什么getLogger(Logger.GLOBAL_LOGGER_NAME)不起作用但getLogger("")有效吗? (3认同)
  • @deinocheirus看到我对此的评论[答案](http://stackoverflow.com/a/2533250/323447) (2认同)

小智 9

重置配置并将根级别设置为OFF

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);
Run Code Online (Sandbox Code Playgroud)


小智 5

您必须指示您的记录器不要将其消息发送到其父记录器:

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
Run Code Online (Sandbox Code Playgroud)

但是,这应该在向记录器添加更多处理程序之前完成.