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

时间:2019-02-20 12:11:58

标签: java logging java.util.logging log-level

在我的应用程序中,我将java.util.logging的根Logger及其所有处理程序设置为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类时我做错什么了吗?

2 个答案:

答案 0 :(得分:2)

是否既要为根Logger设置级别,又要为根Logger的所有子记录器设置Level?

否,显然您正在创建一个新的Logger对象。 Javadoc for getLogger声明:

  

如果创建了新的记录器,则其日志级别将基于   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

答案 1 :(得分:1)

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

话虽如此,我想补充一点知识……随心所欲。

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

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

<块引用>

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