我想以编程方式配置我的 java.util.logging.Logger。根据 Oracle Docs ,这似乎是可能的。

然而,这个例子表明这里有问题:

public static void main(String[] args) {
    Logger logger = Logger.getLogger("org.acme.project");
    logger.setLevel(Level.SEVERE);
    logger = null;

    System.gc();

    logger = Logger.getLogger("org.acme.project");
    logger.warning("You shouldn't see this warning!");
    logger.severe("But this error!");
}

如果您运行代码,您将看到两条消息。然而,如果你删除 logger = null;System.gc(); 你只会看到正确的第二个,这证明垃圾收集器只是删除了配置的记录器,留下 Logger.getLogger(String) 创建一个新的(默认)记录器。

为了“解决”这个问题,我可以在某处保留对该特定记录器的引用,但我认为这不是一个好主意。

那么如何以编程方式定义记录器?

最佳答案



JDK6u18 之前的版本中,LogManager 持有对记录器的强引用。在那个补丁之后, java.util.logging.Logger.getLogger() 方法将读者指向一个强引用:



一个常见的习惯用法是:

private static final String CLASS_NAME = Foo.class.getName();
private static final Logger logger = Logger.getLogger(CLASS_NAME);

您也定义 CLASS_NAME 的原因是您将其用于日志跟踪方法或 logp 方法

此外,像 FindBugs 这样的工具会检测到这种丢失的记录器模式:

关于java - 以编程方式配置记录器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43541482/

10-10 12:55