Tomcat源码分析-Java原生态log运用
2017-06-07 16:19
344 查看
背景
调试tomcat源码过程中,控制台日志打印的都是INFO级别的日志,于是就想修改下日志级别,打印Digester类的DEBUG级别的日志,便于观察Digester类解析server.xml的流程,顺便跟踪了一下tomcat使用日志的流程,整理如下。使用方法
Java提供了原生态的日志工具包java.util.logging,功能虽然没有log4j强大,但是够用了,我想这也是tomcat使用原生日志的原因吧。Java默认的日志配置文件路径是Java安装路径下的\jre\lib\logging.properties。使用过程中可以设置系统变量来改变路径,使用方法很简单,示例如下public class MyClass { public static void main(String[] args) { System.setProperty("java.util.logging.config.file", "D:\\A2017Study\\TomcateStudy\\catalina-home\\conf\\logging.properties"); Logger log = Logger.getLogger("Javasoft"); log.info("aaa"); } }
logging包结构图
从类图上,不难看出,这里使用了工厂模式、单例模式、观察者模式(即监听器);LogManager类负责生成Logger实例,区分用户Logger和系统Logger,默认新建的Logger其isSystemLog标识为false,存储在userContext中,LoggerContext维护了一个HashTable,保存创建的Logger对象。
调用时序图
分析上述示例的main方法,得到整个调用的时序图如下: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”
所以我们可以通过-D配置这两个变量来控制最终的配置文件,如果指定了class类,我们就需要在自定义类的构造函数中完成配置文件的初始化过程,当然直接指定file配置显得更简单一些。
主要关注的是日志的level和handler属性,文章开头的问题,我通过修改Java安装目录下默认的logging.properties文件,修改全局控制台的Handler的配置为java.util.logging.ConsoleHandler.level=FINE,就能打印出tomcat启动过程中的所有日志了。
相关文章推荐
- TOMCAT源码分析(启动框架) 选择自 ThomasHuang 的 CSDN Blog
- TOMCAT源码分析(启动框架)
- tomcat 4.1.30启动过程的源码分析
- Tomcat4.1.24源码分析导引
- Java源码分析:深入探讨Iterator模式及Java 5.0中改进的for循环
- Java源码分析:深入探讨Iterator模式
- Java源码分析:深入探讨Iterator模式
- Java源码分析:深入探讨Iterator模式
- TOMCAT源码分析(启动框架)
- Java源码分析:深入探讨Iterator模式 (转)
- TOMCAT源码分析(消息处理)
- TOMCAT源码分析(消息处理)
- TOMCAT源码分析(启动框架)
- Java源码分析:深入探讨Iterator模式
- Java源码分析:深入探讨Iterator模式
- JAVA开放源码项目与工具在企业应用开发中的运用(ZZ)
- Java源码分析:深入探讨Iterator模式
- Java源码分析:深入探讨Iterator模式
- TOMCAT源码分析(消息处理)
- JDK源码分析:java.lang.Boolean