背景

调试 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包结构图

从类图上,不难看出,这里使用了工厂模式、单例模式、观察者模式(即监听器)。

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”

所以我们可以通过 -Djava.util.logging.config.file 配置这两个变量来控制最终的配置文件,如果指定了class类,我们就需要在自定义类的构造函数中完成配置文件的初始化过程,当然直接指定file配置显得更简单一些。

主要关注的是日志的 level 和 handler 属性,文章开头的问题,通过修改 Java 安装目录下默认的 logging.properties 文件,修改全局控制台的日志等级为java.util.logging.ConsoleHandler.level=FINE,就能打印出 Tomcat 启动过程中的所有日志了。

java 日志_跟着Tomcat学编码:Java 原生日志框架分析相关推荐

  1. ui加Java岗位_本人不怕加班,java和ui学哪个好,打算以后往产品经理方向发展?...

    先说下你的几点问题,三个关键词.①:高中学历.②:不怕吃苦.③:学Java好还是学UI? 关键词一:我们选择做任何一个行业,我们都要对其市场行情进行一个了解,就Java和UI两个行业来看,我自己本身做 ...

  2. 0基础学java培训_零基础可以学习java课程么?零基础java培训需要多久?

    零基础可以学习java课程么? 第一.兴趣爱好是重要,总体目标很重要 在你学习培训java以前,一定要清晰自身对java是不是确实很感兴趣,還是一时头昏脑涨.终究学习培训java不仅要把握技术性,也要 ...

  3. 高中学历可以学java么_初高中学历能学会Java吗,低学历能学Java吗?

    初高中学历能学会Java吗,低学历能学Java吗? 2018-05-25 | 烟台 | 点击211次 | 信息编号:201792910194522310418856521472 很多人以为Java只有 ...

  4. java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?

    问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...

  5. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  6. oracle java认证_如何通过Oracle的Java认证-开发人员实用指南

    oracle java认证 by javinpaul 由javinpaul 如何通过Oracle的Java认证-开发人员实用指南 (How to Pass Oracle's Java Certific ...

  7. 有控制雷电武器的java游戏_雷电飞机射击游戏 JAVA

    一.程序概述 1.开发环境 开发程序的工具Eclipse是著名的跨平台的自由集成开发环境.一个开放源代码的.基于Java的课扩展开发平台.就其本身而言,它只是一个框架和一组服务,用与通过插件组件构建开 ...

  8. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  9. Java能做什么?学完Java可以从事什么工作呢?

    如果你是一个Java初学者,你可能对Java应用在什么地方感到困惑.除了"马里奥""贪吃蛇"等经典游戏,其他领域好像也找不到Java的踪迹,那么Java究竟能做 ...

最新文章

  1. API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
  2. 解决bash: mysql: command not found 的方法
  3. 全球及中国牛乳腺炎治疗系统行业发展调研及投资预测分析报告2022-2027年
  4. VTK:网格之AddCell
  5. linux 字符串转数字排序,linux中sort命令排序功能实现方法
  6. 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
  7. sublime text 3 , 3143
  8. python导入不了包_python – 导入不存在的包
  9. Latest node.js npm installation on Ubuntu 12.04
  10. 怎样用DNSPod做负载均衡?
  11. 《企业IT架构转型之道》读后感(一)
  12. AD21怎么打印丝印层的PDF
  13. 联想笔记本驱动升级,指纹识别不了不成功解决方法
  14. 导热电池粘合剂市场现状及未来发展趋势
  15. 演讲实录(文字+视频)丨基于DevOps的质量左移与右移思考
  16. sudo rm -f /
  17. VBA-API:通过BEEP函数(扬声器)播放音乐
  18. python输出成绩分析代码_Python根据成绩分析系统浅析
  19. mysql 行转列case when_mysql行转列利用casewhen_MySQL
  20. 最强损失函数分析:一般自适应鲁棒损失函数

热门文章

  1. c语言 打开文件夹空格,关于文件操作,碰到空格就换行
  2. nginx大量TIME_WAIT的解决办法(转载)
  3. VirtualBox在桥接模式下无网络处理
  4. 如何下载DELL服务器VMware ESXi镜像
  5. 英特尔在移动市场另辟蹊径
  6. webservice中cxf框架的HelloWord
  7. 工程名.xcodeproj 里面的project.pbxproj
  8. 《The Coaching Booster》问与答
  9. 利用python实现Windows8定时自动关机和休眠
  10. ES不香吗,为啥还要ClickHouse?