• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

深入分析Java的内置日志API(java.util.logging)(四)

Java框架 tiantian 1157次浏览 0个评论 扫描二维码

Hierarchy 中的 Level 继承

正如我们前文所述,日志信息和 Logger 对象都具有 Level,并且通过它们之间的重要性比较可以实现日志信息的过滤。如果某个 Logger 对象具有某个特定的 Level,那么所有传递给该 Logger 对象且严重性小于该 Level 的日志信息都将被遏制。自然,所有这些被遏制的日志信息也不会向上传播给祖先 Logger 对象的 Handler 对象。但是,logjdk 中的 Level 与 Filter 在功能与行为上还是具有非常大的区别。

为了清楚地解释 logjdk 中日志层级体系的 Level 继承机制,本教程使用如下的示例代码:

Logger logger_w = Logger.getLogger("www");
Logger logger_wt = Logger.getLogger("www.tiantianbianma");
Logger logger_wtc = Logger.getLogger("www.tiantianbianma.com");

logger_wt.setLevel(Level.WARNING);

logger_wt.addHandler(new ConsoleHandler());
logger_wtc.addHandler(new ConsoleHandler());

logger_w.info("msg: www");
logger_wt.info("msg: www.tiantianbianma");
logger_wtc.info("msg: www.tiantianbianma.com");

这个示例代码的输出结果是:

七月 17, 2017 4:28:50 下午 com.navercorp.ncp.controller.GreetingController main
信息: msg: www

显然,输出结果中的 “信息: msg: www” 是由 logger_w 输出的,那么 logger_wt 和 logger_wtc 的输出结果在哪里?示例代码中,我们将 logger_wt 的 Level 设置为 WARNING,这将导致 logger_wt 会遏制所有 Level 低于 WARGING 的日志信息,这个解释了 logger_wt 的输出结果。终极疑惑:为什么 logger_wtc 没有输出结果?

不像 Filter 是可选项,每个 Logger 对象必须具有确定的 Level 对象。如果某个 Logger 对象没有指定明确的 Level 对象,那么该 Logger 就会使用继承机制获取祖先 Logger 对象的 Level 对象作为自己的 Level 对象。在上述的示例代码中,由于 logger_wtc 没有明确定义其 Level 对象,所以其直接继承了 logger_wt 的 Level.WARNING 。上述的示例代码对应的 Level 继承图如下所示:

深入分析Java的内置日志API(java.util.logging)(四)

在无法改变 logger_wt 的 Level 为 WARNING 的情况下,如果希望 logger_wtc 可以输出 Level 低于 WARNING 的日志信息,我们可以直接明确指定 logger_wtc 的 Level。 整个的示例代码变成如下所示:

Logger logger_w = Logger.getLogger("www");
Logger logger_wt = Logger.getLogger("www.tiantianbianma");
Logger logger_wtc = Logger.getLogger("www.tiantianbianma.com");

logger_wt.setLevel(Level.WARNING);
logger_wtc.setLevel(Level.INFO);

logger_wt.addHandler(new ConsoleHandler());
logger_wtc.addHandler(new ConsoleHandler());

logger_w.info("msg: www");
logger_wt.info("msg: www.tiantianbianma");
logger_wtc.info("msg: www.tiantianbianma.com");

这个示例代码的输出结果是:

七月 17, 2017 5:07:14 下午 com.navercorp.ncp.controller.GreetingController main
信息: msg: www
七月 17, 2017 5:07:14 下午 com.navercorp.ncp.controller.GreetingController main
信息: msg: www.tiantianbianma.com
七月 17, 2017 5:07:14 下午 com.navercorp.ncp.controller.GreetingController main
信息: msg: www.tiantianbianma.com
七月 17, 2017 5:07:14 下午 com.navercorp.ncp.controller.GreetingController main
信息: msg: www.tiantianbianma.com

从输出结果发现,logger_wtc 的 Level 已经被正确地设置为 Level.INFO,并且正确地输出了 “信息: msg: www.tiantianbianma.com” 。当然,这三份 “信息: msg: www.tiantianbianma.com” 是分别被 root logger 对象、logger_wt 对象和 logger_wtc 对象输出的。

日志配置

虽然 logjdk 是 JDK 中自带的日志实现框架,但是还是有两种配置该框架的方式:

1.  通过配置类
2.  使用配置文件
logjdk 的整个初始化和配置过程是由 java.util.logging.LogManager 来负责的。

配置类

logjdk 允许 Java 工程师使用自定义的类进行个性化配置。当然,必须使用 JVM 启动参数 java.util.logging.config.class 明确告诉 JVM,Java 工程师实际使用的自定义类名。而且,该自定义类的默认构造函数需要完成加载配置信息并配置好日志层次体系中的所有 Logger 对象。

配置文件

除了使用配置类的方式之外,还可以使用配置文件的方式来配置 logjdk。实际上,JDK 自带的日志 API 具有一个默认的日志配置文件,默认位置是 “$(JAVA_HOME)/lib/logging.properties” 。通过修改该文件,就可以改变整个 JRE 的默认日志配置,任何一个使用该 JRE 的 Java 应用获得同样的日志配置。当然,这通常不是一个好的编程实践。

利用 JVM 启动参数 java.util.logging.config.file 可以为某个具体的 Java 应用设置一个独立的日志配置文件。这样就可以单独配置和修改 Java 应用的日志配置情况。配置文件都是标准的 .properties 文件,在这个配置文件中,可以完成 Java 应用中所用 Logger 对象和 Handler 对象的配置。至于具体有哪些配置项和它们对应的配置值,建议直接参考所用 JDK 版本的 JavaDoc 文档。


天天编码 , 版权所有丨本文标题:深入分析Java的内置日志API(java.util.logging)(四)
转载请保留页面地址:http://www.tiantianbianma.com/java-logging-logjdk-four.html/
喜欢 (4)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址