java.util.logging.Logger在控制台中打印了两次消息

11

我正在控制台中运行一个jar文件并设置了日志记录器以便跟踪是否有任何错误。然而,信息消息会在控制台中打印两次。我可以防止这种情况发生吗?

我的代码:

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

你会得到两次输出,因为添加了一个ConsoleHandler,你已经获取的Logger已经有控制台处理程序添加到其中了。 - Hasasn
4个回答

16
准备好面对一下。这个问题基本上是与这个SO问题重复了,但是我仍然会提供答案。
发生的情况是您的Logger类已经有一个默认处理程序,它会将输出打印到System.out控制台。我预计只需以下代码就可以在您的控制台生成输出:
Logger log = Logger.getLogger("Logger");
log.setLevel(Level.ALL);
log.log(Level.INFO, "Reading Configuration File");

但是你已经超越了这个范围,通过添加第二个处理程序,该处理程序也指向控制台。移除这个第二个处理程序,这样就可以解决重复消息的问题。


13

我曾经遇到过这个问题,在我的情况下解决方法是:

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级别更细的内容。


6

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

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

fun reset(rootHandler: Handler?) { val rootLogger = LogManager.getLogManager().getLogger("") val handlers = rootLogger.handlers for (handler in handlers) { rootLogger.removeHandler(handler) } rootLogger.addHandler(rootHandler) }重置函数(reset){ val rootLogger = LogManager.getLogManager().getLogger ("") val handlers = rootLogger.handlers for (handler in handlers) { rootLogger.removeHandler(处理程序) } rootLogger.addHandler(rootHandler) } - BuffK

2
public static void main(String[] args) {

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

 }

以上代码本身足以使用默认日志处理程序打印一次日志。当您添加处理程序时,它将仅使用其默认处理程序在控制台上打印,并且还会将日志记录定向到您添加的所有处理程序以进行打印。由于您正在向记录器添加另一个控制台处理程序,因此所有内容都将被打印(在控制台上记录)两次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接