记录器无法正常运行

时间:2012-09-05 07:46:30

标签: java logging

我正在使用java.util.logging.Logger类来登录我的应用程序。我添加了FileHandler,以便应用程序日志直接存储在log.txt文件中。

但由于某种原因,在应用程序终止后,日志远未完成。在cmd上,我可以看到所有语句,但它们永远不会附加到文件中。

我已将FileHandler设置为Logger:

private void setLogger() {
    try {
        FileHandler hand = new FileHandler("log/log.txt", true);
        hand.setFormatter(new SimpleFormatter());
        Logger log = Logger.getLogger(ImageRename.MAIN_LOG);
        //log.setUseParentHandlers(false);
        log.addHandler(hand);
        log.setLevel(Level.ALL);          
    } catch (IOException e) {
        System.out.println("Could Not set logger");
    }
}

潮红有什么问题吗?怎么解决?感谢。

PS:在调试时,我注意到在

之间
  

Logger.getLogger(ImageRename.MAIN_LOG).getHandlers()。长度

返回0.应该返回的位置1.最初它是打印1,但是在某处,它变为零。

2 个答案:

答案 0 :(得分:3)

问题是...... 垃圾收集

正在发生的事情可能如下:

  1. 您致电Logger.getLogger(ImageRename.MAIN_LOG);
  2. 您设置了记录器。
  3. Java注意到它是未引用的,并将其丢弃。
  4. 您致电Logger.getLogger(ImageRename.MAIN_LOG);并希望获得相同的记录器。
  5. 使用默认配置设置 fresh 记录器。
  6. 您可以通过两种方法来避免这种情况:

    • 使用配置文件logging.properties进行配置。创建记录器时,Java日志记录API将查询配置,从而适当地重新创建它。
    • 使用静态参考。无论如何,这是最好的做法。为每个班级配备一个记录器:

      private final static Logger LOG =
          Logger.getLogger(ExampleClass.class.getName());
      

    在加载类时,它不应该是垃圾收集AFAICT。

答案 1 :(得分:1)

参见例如http://www.massapi.com/class/fi/FileHandler.html示例(通过Google找到)

请注意以下行,这可能是您的问题:

fileHandler.setLevel(Level.ALL);

(注意:这是Handler的级别,而不是Logger或消息的级别。)

对于调试,首先尝试记录ERROR级别的消息。默认情况下,级别INFO及以下级别的邮件通常会被拒绝。

还尝试尽快设置日志记录级别。根据我的经验,配置Java日志记录的最可靠方法是使用属性文件,并使用以下命令调用Java:

-Djava.util.logging.config.file=path/to/file/logging.properties

原因是,一旦对日志记录进行了一些更改,您在加载设置之前, 创建的记录器有时会将 应用于