我在控制台中运行一个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)
但是你已经超越了这个,通过添加第二个处理程序,该处理程序也指向控制台.删除第二个处理程序,这应该处理重复的消息.
我遇到了这个问题,就我而言,解决方案是:
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)
| 归档时间: |
|
| 查看次数: |
6292 次 |
| 最近记录: |