我在控制台中运行一个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
答案 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);}