在我的应用程序中,我将java.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的默认值),而它的根Loggers Level正确设置为FINEST
。不应该为根记录器设置级别还为根记录器的所有子记录器设置级别?我在检索Logger类时做错了吗?
不应该为根记录器设置级别还为根记录器的所有子记录器设置级别?
不,显然您正在创建一个新的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