目录
前言
一、Logback简介
二、Logback组件
三、快速入门
四、配置文件的使用
1. 配置文件中的标签
1.1 logger标签
1.2 root标签
1.3 appender标签
1.4 filter标签
1.5 encoder标签
1.6 property标签
2. 常见的Appender
2.1 ConsoleAppender
2.2 FileAppender
2.3 RollingFileAppender
2.3.1 TimeBasedRollingPolicy
2.3.2 FixedWindowRollingPolicy
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的日志实现依赖:
<!-- 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>
编写如下入门代码:
@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 元素。下面是使用示例:
<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,下面是使用示例:
<configuration>
<root level="debug">
<appender-ref ref="STDOUT"></appender-ref>
</root>
</configuration>
1.3 appender标签
appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等。下面是使用示例:
<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>用于配置不符合过滤条件的操作。下面是使用示例:
<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标签及输出格式的使用示例:
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>
1.6 property标签
property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,下面是一个使用示例:
<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 。
<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。
<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天的日志文件。
<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 仍然是一个值得信赖的选择。