为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2022-06-30 10:45:55
在我的应用程序中,我将根 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 时做错了吗?
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

不应该为根 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


查看完整回答
反对 回复 2022-06-30
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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


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


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

static { JAVA_LOG.setLevel(null); }

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


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


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号