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

Ti *_*i J 6 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");

 }
Run Code Online (Sandbox Code Playgroud)

安慰:

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 13

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

发生的事情是你的Logger类已经有一个默认处理程序打印到System.out控制台.我希望以下代码将在您的控制台中生成输出:

Logger log = Logger.getLogger("Logger");
log.setLevel(Level.ALL);
log.log(Level.INFO, "Reading Configuration File");
Run Code Online (Sandbox Code Playgroud)

但是你已经超越了这个,通过添加第二个处理程序,该处理程序也指向控制台.删除第二个处理程序,这应该处理重复的消息.


Fed*_*cia 8

我遇到了这个问题,就我而言,解决方案是:

Logger logger = Logger.getLogger("Logger");
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
logger.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
Run Code Online (Sandbox Code Playgroud)

请注意调用到的最后一行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");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有得到重复的日志,但我也没有得到比 INFO 级别更好的信息。


小智 6

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

for (Handler handler : logger.getHandlers()) {  logger.removeHandler(handler);}
Run Code Online (Sandbox Code Playgroud)