Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.logging.Logger在控制台中打印消息两次_Java_Logging - Fatal编程技术网

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

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

我正在控制台中运行一个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

准备做一次面部按摩。这个问题基本上是重复的,但我还是要给出答案

发生的情况是,您的
记录器
类已经有了一个默认的处理程序,它将打印到
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)}