31 | Logger组件:Tomcat的日志框架及实战

Posted IT编程学习栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了31 | Logger组件:Tomcat的日志框架及实战相关的知识,希望对你有一定的参考价值。

每一个系统都有一些通用的模块,比如日志模块、异常处理模块、工具类等,对于 Tomcat 来说,比较重要的通用模块有日志、Session 管理和集群管理。从今天开始我会分三期来介绍通用模块,今天这一期先来讲日志模块。

日志模块作为一个通用的功能,在系统里通常会使用第三方的日志框架。Java 的日志框架有很多,比如:JUL(Java Util Logging)、Log4j、Logback、Log4j2、Tinylog 等。除此之外,还有 JCL(Apache Commons Logging)和 SLF4J 这样的“门面日志”。下面是 SLF4J 与日志框架 Logback、Log4j 的关系图:

31 | Logger组件:Tomcat的日志框架及实战

我先来解释一下什么是“门面日志”。“门面日志”利用了设计模式中的门面模式思想,对外提供一套通用的日志记录的 API,而不提供具体的日志输出服务,如果要实现日志输出,需要集成其他的日志框架,比如 Log4j、Logback、Log4j2 等。

这种门面模式的好处在于,记录日志的 API 和日志输出的服务分离开,代码里面只需要关注记录日志的 API,通过 SLF4J 指定的接口记录日志;而日志输出通过引入 JAR 包的方式即可指定其他的日志框架。当我们需要改变系统的日志输出服务时,不用修改代码,只需要改变引入日志输出框架 JAR 包。

今天我们就来看看 Tomcat 的日志模块是如何实现的。默认情况下,Tomcat 使用自身的 JULI 作为 Tomcat 内部的日志处理系统。JULI 的日志门面采用了 JCL;而 JULI 的具体实现是构建在 Java 原生的日志系统java.util.logging之上的,所以在看 JULI 的日志系统之前,我先简单介绍一下 Java 的日志系统。

Java 日志系统

Java 的日志包在java.util.logging路径下,包含了几个比较重要的组件,我们通过一张图来理解一下:

31 | Logger组件:Tomcat的日志框架及实战

从图上我们看到这样几个重要的组件:

  • Logger:用来记录日志的类。

  • Handler:规定了日志的输出方式,如控制台输出、写入文件。

  • Level:定义了日志的不同等级。

  • Formatter:将日志信息格式化,比如纯文本、XML。

我们可以通过下面的代码来使用这些组件:


  
    
    
  

public static void main(String[] args) {


Logger logger = Logger.getLogger("com.mycompany.myapp");


logger.setLevel(Level.FINE);


logger.setUseParentHandlers(false);


Handler hd = new ConsoleHandler();


hd.setLevel(Level.FINE);


logger.addHandler(hd);


logger.info("start log");


}