java 日志_跟着Tomcat学编码:Java 原生日志框架分析
背景
调试 Tomcat 源码过程中,控制台日志打印的都是 INFO 级别的日志,于是就想修改下日志级别,打印 Digester 类的 DEBUG 级别的日志,便于观察 Digester 类解析 server.xml 的流程,顺便跟踪了一下 Tomcat 使用日志的流程,整理如下。
使用方法
Java提供了原生态的日志工具包 java.util.logging,功能虽然没有 log4j 强大,但是够用了,我想这也是 Tomcat 使用原生日志的原因吧。Java 默认的日志配置文件路径是 Java 安装路径下的 jreliblogging.properties。
使用过程中可以设置系统变量来改变路径,使用方法很简单,示例如下
public class MyClass { public static void main(String[] args) { System.setProperty("java.util.logging.config.file", "D:A2017StudyTomcateStudycatalina-homeconflogging.properties"); Logger log = Logger.getLogger("Javasoft"); log.info("aaa"); }}
logging包结构图
![](/assets/blank.gif)
从类图上,不难看出,这里使用了工厂模式、单例模式、观察者模式(即监听器)。
LogManager 类负责生成 Logger 实例,区分用户 Logger 和系统 Logger,默认新建的 Logger其 isSystemLog 标识为false,存储在 userContext 中。
LoggerContext 维护了一个 HashTable,保存创建的Logger对象。
调用时序图
分析上述示例的 main 方法,得到整个调用的时序图如下:
![](/assets/blank.gif)
logging.properties 文件的作用就是定义 Logger 的 Handler 和 level,这个文件是在 LogManager 的构造方法中调用的,源码如下:
public static LogManager getLogManager() { if (manager != null) { manager.readPrimordialConfiguration(); } return manager; } public void readConfiguration() throws IOException, SecurityException { checkPermission(); String cname = System.getProperty("java.util.logging.config.class"); if (cname != null) { try { Class clz = ClassLoader.getSystemClassLoader().loadClass(cname); clz.newInstance(); return; } String fname = System.getProperty("java.util.logging.config.file"); if (fname == null) { fname = System.getProperty("java.home"); if (fname == null) { throw new Error("Can't find java.home ??"); } File f = new File(fname, "lib"); f = new File(f, "logging.properties"); fname = f.getCanonicalPath(); } …… }
readConfiguration() 值得关注的是两个配置(其他代码省略了,只保留重要代码)。
LogManager 类通过它们来控制配置文件的初始化,类注释如下:
In addition, the LogManager uses two optional system properties that
allow more control over reading the initial configuration:
“java.util.logging.config.class”
“java.util.logging.config.file”
所以我们可以通过 -Djava.util.logging.config.file 配置这两个变量来控制最终的配置文件,如果指定了class类,我们就需要在自定义类的构造函数中完成配置文件的初始化过程,当然直接指定file配置显得更简单一些。
主要关注的是日志的 level 和 handler 属性,文章开头的问题,通过修改 Java 安装目录下默认的 logging.properties 文件,修改全局控制台的日志等级为java.util.logging.ConsoleHandler.level=FINE,就能打印出 Tomcat 启动过程中的所有日志了。
java 日志_跟着Tomcat学编码:Java 原生日志框架分析相关推荐
- ui加Java岗位_本人不怕加班,java和ui学哪个好,打算以后往产品经理方向发展?...
先说下你的几点问题,三个关键词.①:高中学历.②:不怕吃苦.③:学Java好还是学UI? 关键词一:我们选择做任何一个行业,我们都要对其市场行情进行一个了解,就Java和UI两个行业来看,我自己本身做 ...
- 0基础学java培训_零基础可以学习java课程么?零基础java培训需要多久?
零基础可以学习java课程么? 第一.兴趣爱好是重要,总体目标很重要 在你学习培训java以前,一定要清晰自身对java是不是确实很感兴趣,還是一时头昏脑涨.终究学习培训java不仅要把握技术性,也要 ...
- 高中学历可以学java么_初高中学历能学会Java吗,低学历能学Java吗?
初高中学历能学会Java吗,低学历能学Java吗? 2018-05-25 | 烟台 | 点击211次 | 信息编号:201792910194522310418856521472 很多人以为Java只有 ...
- java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?
问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...
- java超线程_超线程多核心下Java多线程编程技术分析
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...
- oracle java认证_如何通过Oracle的Java认证-开发人员实用指南
oracle java认证 by javinpaul 由javinpaul 如何通过Oracle的Java认证-开发人员实用指南 (How to Pass Oracle's Java Certific ...
- 有控制雷电武器的java游戏_雷电飞机射击游戏 JAVA
一.程序概述 1.开发环境 开发程序的工具Eclipse是著名的跨平台的自由集成开发环境.一个开放源代码的.基于Java的课扩展开发平台.就其本身而言,它只是一个框架和一组服务,用与通过插件组件构建开 ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- Java能做什么?学完Java可以从事什么工作呢?
如果你是一个Java初学者,你可能对Java应用在什么地方感到困惑.除了"马里奥""贪吃蛇"等经典游戏,其他领域好像也找不到Java的踪迹,那么Java究竟能做 ...
最新文章
- API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
- 解决bash: mysql: command not found 的方法
- 全球及中国牛乳腺炎治疗系统行业发展调研及投资预测分析报告2022-2027年
- VTK:网格之AddCell
- linux 字符串转数字排序,linux中sort命令排序功能实现方法
- 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
- sublime text 3 , 3143
- python导入不了包_python – 导入不存在的包
- Latest node.js npm installation on Ubuntu 12.04
- 怎样用DNSPod做负载均衡?
- 《企业IT架构转型之道》读后感(一)
- AD21怎么打印丝印层的PDF
- 联想笔记本驱动升级,指纹识别不了不成功解决方法
- 导热电池粘合剂市场现状及未来发展趋势
- 演讲实录(文字+视频)丨基于DevOps的质量左移与右移思考
- sudo rm -f /
- VBA-API:通过BEEP函数(扬声器)播放音乐
- python输出成绩分析代码_Python根据成绩分析系统浅析
- mysql 行转列case when_mysql行转列利用casewhen_MySQL
- 最强损失函数分析:一般自适应鲁棒损失函数