1

我正在使用java.util.logging.LoggerClass 登录我的应用程序。我添加了 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().length

返回 0。它应该返回 1。最初它打印 1,但在某处它变成了零。

4

2 回答 2

3

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

发生的情况可能如下:

  1. 你打电话Logger.getLogger(ImageRename.MAIN_LOG);
  2. 您设置了记录器。
  3. Java 注意到它未被引用,并丢弃它。
  4. 您打电话Logger.getLogger(ImageRename.MAIN_LOG);并期望得到相同的记录器。
  5. 使用默认配置设置新的记录器。

您可以通过两种措施避免这种情况:

  • 使用配置文件logging.properties进行配置。创建记录器时,Java 记录 API 将参考配置,从而适当地重新创建它。
  • 使用静态引用。无论如何,这是一个最佳实践。为每个类配备一个记录器:

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

当类被加载时,它不应该被垃圾收集 AFAICT。

于 2012-09-05T08:34:17.747 回答
1

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

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

fileHandler.setLevel(Level.ALL);

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

对于调试,首先尝试在ERROR记录的级别获取消息。INFO默认情况下,通常会抑制级别及以下级别的消息。

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

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

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

于 2012-09-05T07:59:42.087 回答