写这篇文章主要是记录一下自己的学习。原由是工作中突然被指派去调整一下日志。当时一想,之前学的好像都忘光了,这可抓瞎了。咋办呢?学呗,再复习一下,回顾了一下知识点,慢慢就又上手了。
浅浅记录一下 Logback是一种基于Java的日志记录框架,是log4j框架的继承者。Logback提供了一种高效、可配置和灵活的方式来记录日志,并且可以非常容易地与其他Java框架集成。本文将介绍Logback的基本概念、配置和用法。
Logback的基本概念
Logback由三个模块组成:
- logback-core:提供了日志记录的核心功能。
- logback-classic:建立在logback-core之上,提供了与log4j兼容的API。
- logback-access:提供了HTTP访问日志功能。
Logback的核心组件包括Logger、Appender和Layout。
- Logger是Logback中最重要的组件,它负责记录日志消息。Logger有一个层次结构,每个Logger都有一个名称,这个名称可以包含多个单词,用"."分隔。
-
- 例如,一个Logger的名称可以是"com.example.app",它有一个父Logger"com.example",它有一个更高级别的Logger"com"。当Logger记录一条消息时,它会沿着Logger层次结构向上查找,直到找到一个具有Appender的Logger,然后将消息发送到这个Appender。
- Appender是负责将日志消息发送到目的地的组件。
-
- 例如,一个Appender可以将日志消息写入文件、控制台、数据库或远程服务器。Logback提供了多种类型的Appender,包括ConsoleAppender、FileAppender、RollingFileAppender、SMTPAppender、SocketAppender等。
- Layout是负责格式化日志消息的组件。它将日志消息的各个部分组合成一条完整的日志记录。
-
- 例如,一个Layout可以将日志消息格式化为JSON、XML、HTML、纯文本等格式。
Logback的特点
Logback具有以下几个特点:
- 高性能:Logback使用异步日志记录,能够处理高负载场景,避免对应用程序的性能影响。
- 可靠性高:Logback使用单线程模型,保证了日志记录的顺序和完整性。
- 灵活性强:Logback提供了丰富的配置选项,可以根据不同的需求进行灵活配置。
- 可扩展性好:Logback的架构清晰,易于扩展和定制。
Logback的配置
- 首先看一个正常的配置
Logback的配置文件通常被称为logback.xml,它定义了Logger、Appender和Layout的配置。Logback的配置文件需要放置在classpath根目录下。下面是一个简单的logback.xml配置文件的示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
解释一下:
- appender元素定义了一个名为STDOUT的控制台输出Appender,使用的是ConsoleAppender类- encoder元素定义了输出格式的模式,使用了%-4relative、[%thread]、%-5level、%logger{35}和%msg%n等占位符。
- logger元素定义了名为com.example的Logger对象,其级别为DEBUG,它关联了STDOUT的Appender。
- root元素是Logger对象的根元素,它定义了日志级别为INFO,同时也关联了STDOUT的Appender。
这个配置文件的含义是:当一个Logger对象的名字以com.example开头时,它将会使用名为STDOUT的Appender输出DEBUG级别及以上的日志信息;当一个Logger对象的名字不以com.example开头时,将会使用root元素定义的默认Appender输出INFO级别及以上的日志信息。
- 先看一个稍微不正常的配置
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
<logger name="com.example" level="INFO">
<appender-ref ref="FILE" />
</logger>
举个例子:
- 如果一个日志事件的Logger对象名称为"com.example",并且级别为DEBUG,那么它将只能匹配root元素,并且使用root元素关联的Appender。
- 如果一个日志事件的Logger对象名称为"com.example",并且级别为INFO,那么它将只匹配到logger元素,并且使用logger元素关联的Appender。
为什么为什么级别为DEBUG,就会匹配root???
首先明确一点在logback中,如果一个日志事件的级别低于某个Logger对象或root元素的级别,那么这个日志事件就不会被记录。
因此,在默认情况下,如果一个Logger对象没有定义级别,它会继承其父Logger对象的级别,直到找到定义了级别的Logger对象或root元素。
对于上面的例子,假设一个日志事件的级别为DEBUG,因为root元素定义的级别为DEBUG,因此这个日志事件将会被root元素匹配到,并且记录到root元素关联的Appender中。
同时,因为logger元素定义的级别为INFO,DEBUG级别低于INFO级别,所以这个日志事件不会被logger元素匹配到。但是,如果这个日志事件的级别为INFO,那么它将会被logger元素匹配到,并且记录到logger元素关联的Appender中。
- 再看一个稍微不正常的配置
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<logger name="com.example" level="INFO">
<appender-ref ref="FILE" />
</logger>
举个例子:
- 如果一个日志事件的Logger对象名称为"com.example",并且级别为INFO,那么既能够匹配root元素,也能够匹配logger元素。
- 但是他只会使用root元素关联的Appender记录日志。
为什么为什么会使用root元素关联的Appender记录日志。???
如果一个日志事件同时匹配到root元素和logger元素,那么只有匹配顺序在前的Appender会被执行。
在这个例子中,因为root元素在logger元素之前定义,所以一个级别为INFO的日志事件会被root元素匹配到,并且使用root元素关联的Appender记录日志。如果将logger元素定义放在root元素之前,那么一个级别为INFO的日志事件将会被logger元素匹配到,并且使用logger元素关联的Appender记录日志。
日志级别
Logback提供了五种日志级别,由低到高分别是:TRACE、DEBUG、INFO、WARN、ERROR。
总结
logback是一个功能强大的Java日志框架,提供了高度的可配置性和灵活性。通过配置文件的方式,可以轻松地对logback进行配置和管理。同时,logback的使用也非常简单,只需要创建Logger对象并调用它的方法即可记录日志信息。