即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Tomcat源码解析-Java语言原生态log运用

编程语言 wojiushiwo945you 92℃ 0评论
本文目录
[隐藏]

1.背景

调试tomcat源码过程中,控制台日志打印的都是INFO级别的日志,于是就想修改下日志级别,打印Digester类的DEBUG级别的日志,便于观察Digester类解析server.xml的流程,顺便跟踪了一下tomcat使用日志的流程,整理如下。

2.使用方法

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");
    }
}

3.logging包结构图

这里写图片描述


从类图上,不难看出,这里使用了工厂模式、单例模式、观察者模式(即监听器);LogManager类负责生成Logger实例,区分用户Logger和系统Logger,默认新建的Logger其isSystemLog标识为false,存储在userContext中,LoggerContext维护了一个HashTable,保存创建的Logger对象。

4.调用时序图

分析上述示例的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启动过程中的所有日志了。

转载请注明:CodingBlog » Tomcat源码解析-Java语言原生态log运用

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情