在我的应用程序中,我将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类时我做错什么了吗?
答案 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
<块引用>如果新级别为空,则意味着此节点应从其最近的祖先继承其级别,并具有特定(非空)级别值。