我想以编程方式配置我的 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/