目录
[1. 配置文件中的标签](#1. 配置文件中的标签)
[1.1 logger标签](#1.1 logger标签)
[1.2 root标签](#1.2 root标签)
[1.3 appender标签](#1.3 appender标签)
[1.4 filter标签](#1.4 filter标签)
[1.5 encoder标签](#1.5 encoder标签)
[1.6 property标签](#1.6 property标签)
[2. 常见的Appender](#2. 常见的Appender)
[2.1 ConsoleAppender](#2.1 ConsoleAppender)
[2.2 FileAppender](#2.2 FileAppender)
[2.3 RollingFileAppender](#2.3 RollingFileAppender)
[2.3.1 TimeBasedRollingPolicy](#2.3.1 TimeBasedRollingPolicy)
[2.3.2 FixedWindowRollingPolicy](#2.3.2 FixedWindowRollingPolicy)
[3. 异步日志](#3. 异步日志)
前言
日志是软件开发中不可或缺的一部分,它不仅能够帮助开发者了解应用程序运行的状态,还能在出现问题时提供诊断信息。Logback 是一个高效、灵活的日志框架,它由 Log4j 的创始人 Ceki Gülcü 开发,并且是 SLF4J (Simple Logging Facade for Java) 的默认实现。Logback 分为三个模块:core、classic 和 access,其中 classic 模块提供了丰富的日志功能。本文将介绍 Logback 的基本概念,包括其组件结构、快速入门、配置文件的使用、常见的 Appender 以及如何配置异步日志记录等功能。
一、Logback简介
Logback是由Log4j创始人设计的又一个开源日志组件,当前分为三个模块:logback-core、logback-classic和logback-access,其中logback-core是其他两个模块的基础模块。logback-classic是log4j的一个改良版本,此外logbac-classic完整实现SLF4J API,使你开以很方便地更换成其他日志系统如log4j或JDK14 Loggin。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
二、Logback组件
**Logger:**日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
**Layout:**负责把事件转换为字符串,格式化的日志信息的输出。在Logback中Layout对象封装在encoder中,也就是说我们配置文件中使用的encoder其实就是Layout。
三、快速入门
首先,我们导入slf4j日志门面和logback的日志实现依赖:
XML
<!-- slf4j依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.13</version>
</dependency>
<!-- logback日志实现 logback-classic已经涵盖logback-core这个依赖了 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.6</version>
</dependency>
编写如下入门代码:
java
@Test
public void testQuick() {
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
运行结果如下图所示:
**补充:**logback有5种日志输出级别。分别是trace < debug < info < warn < error,其中debug是默认的日志级别。
四、配置文件的使用
Logback提供了logback.groovy、logback-test.xml和logback.xml这三种配置文件(如果都不存在则采用默认的配置)。一般来说,我们会使用logback.xml来作为配置文件。Logback配置文件一般在springboot项目的src/main/resources目录下创建名为logback-spring.xml的文件。
1. 配置文件中的标签
1.1 logger标签
logger是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素。下面是使用示例:
XML
<configuration>
<logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">
<appender-ref ref="STDOUT"></appender-ref>
</logger>
</configuration>
1.2 root标签
root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。
level属性可以选择,ALL、TRACE、DEBUG、INFO、WARN、ERROR、NULL、OFF、INHERITED,下面是使用示例:
XML
<configuration>
<root level="debug">
<appender-ref ref="STDOUT"></appender-ref>
</root>
</configuration>
1.3 appender标签
appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等。下面是使用示例:
XML
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</configuration>
补充(常见的附加器)
控制台附加器: ch.qos.logback.core.ConsoleAppender。
文件附加器: ch.qos.logback.core.FileAppender。
**滚动文件附加器:**ch.qos.logback.core.rolling.RollingFileAppender,属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等。
1.4 filter标签
filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。DENY是不输出日志,NEUTRAL是不决定是否输出日志,ACCEPT是输出日志。
在filter中 ,可以有三个元素,level元素、onMatch元素和onMismatch元素。其中,<level>用于设置过滤级别,<onMatch>用于配置符合过滤条件的操作,<onMismatch>用于配置不符合过滤条件的操作。下面是使用示例:
XML
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter>
<level>info</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</configuration>
1.5 encoder标签
encoder最主要的就是pattern标签,用于控制输出日志的格式,常见的一些日志的输出格式如下面所示:
- %-10level 日志级别 案例为设置10个字符,左对齐
- %d {yyyy-MM-dd HH:mm:ss.SSS} 日期
- %c 当前类全限定名
- %M 当前执行日志的方法
- %L 行号
- %thread 线程名称
- %m 或者%msg 信息
- %n 换行
- %logger 输出日志的类名
- %logger{length} 对输出日志的类名缩写展示
下面是一个encoder标签及输出格式的使用示例:
XML
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
1.6 property标签
property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,下面是一个使用示例:
XML
<property name="HOME" value="../log">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<file>${HOME}/log.log</file>
</appender>
2. 常见的Appender
2.1 ConsoleAppender
把日志添加到控制台,有以下子节点:
- <encoder>:对日志进行格式化。
- <target>:字符串 System.out 或者 System.err ,默认 System.out 。
XML
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2.2 FileAppender
把日志添加到文件,有以下子节点:
- <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- <encoder>:对记录事件进行格式化。
- <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是false。
XML
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
**补充:**除了将文件以.log的文本形式输出外,我们还可以将文件输出成html文件,相关配置如下图所示:
2.3 RollingFileAppender
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
- <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- <encoder>:对记录事件进行格式化。
- <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
- <triggeringPolicy>: 告知 RollingFileAppender 何时激活滚动。
- <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制:不支持也不允许文件压缩;不能设置file属性,必须留空。
其中,对于滚动策略RollingPolicy,可以有以下两个策略:
2.3.1 TimeBasedRollingPolicy
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。有以下子节点:
- <fileNamePattern>:必要节点,包含文件名及"%d"转换符, "%d"可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。"/"或者"\"会被当做目录分隔符。
- <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
2.3.2 FixedWindowRollingPolicy
FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
- <minIndex>:窗口索引最小值
- <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
- <fileNamePattern >:必须包含"%i"例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
下面是一个简单的示例,表示每天生成一个日志文件,保存30天的日志文件。
XML
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
3. 异步日志
所谓异步日志,系统会为日志操作单独分配出来一个线程,原来用来执行当前方法的主线程会继续向下执行,两个线程争夺CPU的使用权,在实际项目开发中,越大的项目对于日志的记录就越庞大,为了保证项目的执行效率,异步日志是一个很好的选择。下图是异步日志的一个使用示例:
总结
在本文中,我们介绍了 Logback 的基本概念和使用方法。从 Logback 的架构开始,我们了解到它分为 core、classic 和 access 三个模块,以及它与 SLF4J 的关系。接着通过快速入门的例子,展示了如何在项目中引入 Logback 并进行日志记录。随后,我们详细探讨了 Logback 的配置文件,包括常用的标签和属性,以及如何配置不同的 Appender 实现不同的日志输出需求。最后,我们还介绍了如何利用异步日志来提高程序性能。无论是简单的需求还是复杂的应用场景,Logback 都能提供强大的支持。随着对日志需求的增长和技术的发展,Logback 仍然是一个值得信赖的选择。