java.util.logging.Logger在控制台中输出两次Message

时间:2015-07-23 01:34:51

标签: java logging

我在控制台中运行一个jar文件,然后放入logger,以便我可以跟踪是否有任何错误。但是,消息信息在控制台中打印两次。我可以阻止这个吗?

我的代码:

public static void main(String[] args) {

     Logger log = Logger.getLogger("Logger");
     log.setLevel(Level.ALL);

     ConsoleHandler handler = new ConsoleHandler();
     handler.setFormatter(new SimpleFormatter());
     handler.setLevel(Level.ALL);
     log.addHandler(handler);

     log.log(Level.INFO, "Reading Configuration File");

 }

控制台:

Jul 22, 2015 9:30:33 PM com.ouc.mv90.conversion.CSVtoMV90Converter main
INFO: Reading Configuration File
Jul 22, 2015 9:30:33 PM com.ouc.mv90.conversion.CSVtoMV90Converter main
INFO: Reading Configuration File

4 个答案:

答案 0 :(得分:10)

为facepalm做好准备。这个问题基本上与this SO question重复,但无论如何我都会给出答案。

正在发生的事情是您的120%类已经有一个默认处理程序,可以打印到Logger控制台。我希望以下代码只会在您的控制台中生成输出:

System.out

但是你已经超越了这一点,增加了一个第二个处理程序,它也是针对控制台的。删除第二个处理程序,这应该处理重复的消息。

答案 1 :(得分:2)

public static void main(String[] args) {

     Logger log = Logger.getLogger("Logger");
     log.setLevel(Level.ALL);
     log.log(Level.INFO, "Reading Configuration File");

 }

上面的代码本身足以使用它的默认日志处理程序打印一次日志。当您添加处理程序时,它只会使用它的默认处理程序在控制台中打印,日志记录也会定向到您要添加的所有处理程序以进行打印。由于您要在记录器中添加另一个控制台处理程序,因此将会打印(在控制台上记录)两次。\ / p>

答案 2 :(得分:2)

我遇到了这个问题,在我的情况下解决方案是:

Logger logger = Logger.getLogger("Logger");
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
logger.setLevel(Level.ALL);
logger.setUseParentHandlers(false);

注意调用setUseParentHandlers的最后一行。没有这行,我会得到重复的日志。我在运行时检查过,在我的情况下,logger.getHandlers()返回的处理程序数量在添加我的控制台处理程序后仅为1。

如果我尝试

Logger logger = Logger.getLogger("Logger");
logger.setLevel(Level.ALL);
logger.log(Level.INFO, "Reading Configuration File");
logger.log(Level.FINE, "another message");

在这种情况下,我不会获得重复的日志,但我也没有得到比INFO级别更精细的内容。

答案 3 :(得分:2)

在将其添加到记录器之前,只需删除所有处理程序,例如:

for (Handler handler : logger.getHandlers()) {  logger.removeHandler(handler);}