记录器的更改可能会丢失

时间:2012-08-14 08:35:15

标签: java findbugs

我有一个java命令行工具,可以在最开始时关闭注销,然后解析命令行,之后可能会再次启用登录,具体取决于命令行处理的结果。

主要方法是这样开始的:

public static void main(final String[] args){
    java.util.logging.LogManager.getLogManager().reset();
    java.util.logging.Logger globalLogger = java.util.logging.Logger
            .getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
    globalLogger.setLevel(java.util.logging.Level.OFF);
    [... parse command line and possibly turn logging back on]

现在,Findbugs发出一条“令人不安的”警告说:

  

在com.bmw.fnw.DBMainDialog.main(String [])中可能会丢失对记录器的更改

来自Find Bugs Description 我知道记录器可以在不应该的时候进行。

如何正确关闭记录器?

3 个答案:

答案 0 :(得分:4)

只要您需要它(可能是程序的生命周期),只需对记录器进行强有力的引用。

您提供的链接已解释原因: 在OpenJDk中,logManager内部仅保留弱引用。因此,只要没有强引用,记录器就有资格进行垃圾回收。所以你设置了配置,但是没有强大的参考。它可能是垃圾收集。再次获取Logger时,将实例化一个新的Logger。通过持有强引用来防止垃圾收集。

答案 1 :(得分:1)

您是否正在使用Find Bugs说明中所述的OpenJDK?

无论他们谈论弱引用,我想到的是你可以在这个记录器的某处创建一个静态引用,以避免在垃圾回收期间丢失它。

要测试问题,您可以将自己称为代码中的垃圾收集器,看看它是否发生了任何变化。

答案 2 :(得分:0)

我有完全相同的问题,也无法摆脱警告。我不知道FindBugs是否只是在搞乱我们,但是持有一个强大的参考似乎并没有帮助。

为了摆脱警告,我只是包含了log4j。然后,您可以设置-Dlog4j.configuration =< FILE_PATH>作为jvm参数的一部分。 FILE_PATH是log4j.properties文件的路径。 参考:log4j configuration via JVM argument(s)?

这将停止向您发出警告,您仍然可以配置调试级别。希望这有帮助!

A〜