java.util.logging.Logger在控制台中打印消息两次
我正在控制台中运行一个jar文件,并放置了记录器,以便在出现任何错误时跟踪日志。但是,消息信息在控制台中打印两次。我能阻止吗 我的代码:java.util.logging.Logger在控制台中打印消息两次,java,logging,Java,Logging,我正在控制台中运行一个jar文件,并放置了记录器,以便在出现任何错误时跟踪日志。但是,消息信息在控制台中打印两次。我能阻止吗 我的代码: public static void main(String[] args) { Logger log = Logger.getLogger("Logger"); log.setLevel(Level.ALL); ConsoleHandler handler = new ConsoleHandler(); handl
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
准备做一次面部按摩。这个问题基本上是重复的,但我还是要给出答案 发生的情况是,您的
记录器
类已经有了一个默认的处理程序,它将打印到System.out
控制台。我希望以下代码将在控制台中生成输出:
Logger log = Logger.getLogger("Logger");
log.setLevel(Level.ALL);
log.log(Level.INFO, "Reading Configuration File");
但是您已经超越了这一点,添加了第二个处理程序,它也指向控制台。删除第二个处理程序,它将处理重复的消息
public static void main(String[] args) {
Logger log = Logger.getLogger("Logger");
log.setLevel(Level.ALL);
log.log(Level.INFO, "Reading Configuration File");
}
以上代码本身足以使用默认日志处理程序打印日志一次。当您添加处理程序时,它将仅使用其默认处理程序在控制台中打印,日志记录也将定向到要打印的所有添加的处理程序。由于您正在向记录器添加另一个控制台处理程序,veerything将被打印(登录到控制台)两次。我遇到了这个问题,在我的情况下,解决方案是:
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");
在这种情况下,我不会得到重复的日志,但也不会得到比信息级别更好的日志。只需删除所有处理程序,然后再将其添加到日志中,如:
for (Handler handler : logger.getHandlers()) { logger.removeHandler(handler);}
由于添加了ConsoleHandler,您得到了两次它,您得到的记录器已经添加了ConsoleHandler.fun reset(rootHandler:handler?{val rootLogger=LogManager.getLogManager().getLogger(“”)val handlers=rootLogger.handlers for(处理程序中的处理程序){rootLogger.removeHandler(handler)}rootLogger.addHandler(rootHandler)}