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[]) 中丢失

查找错误描述 中,我了解到记录器可能会在不应该出现的时候出现。

我该怎么做才能正确关闭记录器?

4

3 回答 3

4

只要您需要它(可能在您的程序的整个生命周期内),只需对记录器进行强引用。

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

于 2012-08-14T08:43:22.903 回答
1

您是否按照 Find Bugs 描述中的说明使用 OpenJDK?

自从他们谈论弱引用以来,我想到的是,您可以在某处创建此记录器的静态引用,以避免在垃圾收集期间丢失它。

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

于 2012-08-14T08:41:14.340 回答
0

我遇到了完全相同的问题,也无法摆脱警告。我不知道 FindBugs 是否只是在惹我们生气,但持有强引用似乎无济于事。

为了摆脱警告,我简单地包含了 log4j。然后,您可以将 -Dlog4j.configuration=< FILE_PATH > 设置为 jvm 参数的一部分。FILE_PATH 是 log4j.properties 文件的路径。参考:通过 JVM 参数进行 log4j 配置?

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

啊~

于 2012-08-17T07:01:24.347 回答