3

在我的应用程序中,我将根 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 时做错了吗?

4

2 回答 2

2

不应该为根 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 = FINE
myProject.MyOtherNotSoImportantClass.level = INFO
mySecondProject.MainClass.level = NONE

一个更好的解决方案是复制logging.properties到您的项目目录并调用您的应用程序

java -Djava.util.logging.config.file=./src/test/resources/logging.properties
于 2019-02-20T12:46:47.953 回答
1

接受的答案是完全有效的,我完全同意。

也就是说,我想补充一点知识……随心所欲。

private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
static { JAVA_LOG.setLevel(null); }

这将告诉它继承其祖先日志级别。Logger.setLevel() javadoc

如果新级别为空,则意味着该节点应从其最近的祖先处继承其级别,并具有特定(非空)级别值。

于 2021-02-19T13:18:14.207 回答