2012-08-14 133 views
2

我有一个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 我下认为记录器可以在不应该时记录下来。

如何正确关闭记录仪?

回答

1

您是否使用了查找错误描述所述的OpenJDK?

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

要测试这个问题,你可以在你的代码中调用你自己的垃圾收集器,看它是否改变了任何东西。

+2

无论您使用的是哪个JDK。运行该代码的人可能会使用OpenJDK。因此,无论您使用的是哪个JDK,都应该修复这个“bug”。 – Polygnome 2012-08-14 09:57:31

+1

感谢您的回答。我做了我的记录器'私有最终静态',但现在FindBugs抱怨'globalLogger.setLevel(java.util.logging.Level.OFF);'具有相同的错误消息。现在我该怎么做? – bbuser 2012-08-14 14:23:28

3

只要您需要它(可能是您的程序的整个生命周期),只要持有记录器的强烈参考即可。

您给出的链接已经解释了原因: 在OpenJDK中,logManager内部只保留弱引用。因此,只要没有强大的参考,记录器就有资格进行垃圾收集。所以你要设定配置,但不要强调参考。它可能是垃圾收集。当你再次获取记录器时,会新建一个新记录器。通过持有强有力的参考来防止垃圾收集。

+1

我已经让我的记录器变成静态的,但现在FindBugs抱怨'globalLogger.setLevel(java.util.logging.Level.OFF);'。 – bbuser 2012-08-14 14:43:52

0

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

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

这将停止给你的警告,你仍然可以配置调试级别。希望这可以帮助!

A〜