猿问

java.util.logging.Logger 的级别与其根 Logger 不同

在我的应用程序中,我将根 Loggerjava.util.logging及其所有处理程序设置为Level.FINEST如下所示:


Logger.getLogger("").setLevel(Level.FINEST);

for (Handler handler : Logger.getLogger("").getHandlers()) {

      handler.setLevel(Level.FINEST);

}

稍后我会创建一个像这样的类 Logger:


private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());

现在这个记录器级别是INFO(这似乎是 JUL 的默认值),而它的根记录器级别被正确设置为FINEST. 不应该为根 Logger 设置级别也为根 Logger 的所有子记录器设置级别吗?我在检索类 Logger 时做错了吗?


慕斯王
浏览 113回答 2
2回答

www说

不应该为根 Logger 设置级别也为根 Logger 的所有子记录器设置级别吗?不,显然您正在创建一个新的 Logger 对象。getLogger 的 Javadoc状态:如果创建了一个新的记录器,它的日志级别将基于 LogManager 配置进行配置,并且它还将配置为将日志输出发送到其父处理程序。请注意,即使之前有一个同名的 Logger 对象,您也不能依赖getLogger返回相同的对象,因为如果没有对该对象的强引用,它可能已被垃圾回收。如果您的目标是在项目中创建具有相同日志级别的所有 Logger 对象,则不应以编程方式进行,而应通过配置进行。这就是java.util.logging派上用场的地方。总体优势是您可以在不同的日志级别运行应用程序,甚至无需更改一行代码。只需编辑您的配置文件(本质上就是上面提到的LogManager configuration)。它被调用logging.properties并位于您的 JRE 目录中。在那里您可以编辑最后一段并配置项目范围或类缩小的日志级别:############################################################# Facility specific properties.# Provides extra control for each logger.############################################################myProject.MyClass.level = FINEmyProject.MyOtherNotSoImportantClass.level = INFOmySecondProject.MainClass.level = NONE一个更好的解决方案是复制logging.properties到您的项目目录并调用您的应用程序java -Djava.util.logging.config.file=./src/test/resources/logging.properties

繁星淼淼

接受的答案是完全有效的,我完全同意。也就是说,我想补充一点知识……随心所欲。private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());static { JAVA_LOG.setLevel(null); }这将告诉它继承其祖先日志级别。Logger.setLevel() javadoc如果新级别为空,则意味着此节点应从其最近的祖先处继承其级别,并具有特定的(非空)级别值。
随时随地看视频慕课网APP

相关分类

Java
我要回答