SpringBoot日志进阶实战之Logback配置经验和方法
作者:天罡gg
前言
在上一篇文章中,我和你介绍了SpringBoot快速入门Slf4j + Logback实战,遗留的问题是如何将日志输出到文件。
今天这篇文章分享了我在SpringBoot中使用Logback配置日志的经验和方法,并提供了详细的代码示例和解释,包括:滚动文件、异步日志记录、动态指定属性、日志级别、配置文件等常用功能,覆盖日常Logback配置开发90%的知识点!
一、Logback入门级配置
在tg-book-web的src\main\resources下创建logback-spring.xml文件,这里给出最简单的输出到控制台
和文件
的示例
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 定义属性,可以通过“${}”来使用属性 --> <property name="LOG_PATH" value="d:/logs/"/> <property name="APP_ID" value="tg-book"/> <!-- 把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> </encoder> </appender> <!-- 把日志输出到文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> <charset>UTF-8</charset> </encoder> <file>${LOG_PATH}/${APP_ID}.log</file> </appender> <!-- 大于等于info级别的才会输出 --> <root level="info"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </root> </configuration>
上面的配置,将输出日志到文件d:/logs/tg-book.log中。
常用节点的解释:
- configuration:根节点,包含所有配置信息。
- property:定义属性,可以通过“${}”来使用属性
- appender:定义输出器的名称、类型、编码、日志输出路径等信息。
- class=“ch.qos.logback.core.ConsoleAppender”:输出到控制台
- class=“ch.qos.logback.core.FileAppender”:输出到文件
- root:定义日志记录器的根节点,指定默认的日志记录级别、输出器等信息。
二、动态指定属性
定义springProperty标签,通过指定source来源于application.properties的配置值!
- 修改上面的
logback-spring.xml
文件,仅将property 标签注释,新增springProperty
标签,如下:
<!--<property name="LOG_PATH" value="d:/logs/"/> <property name="APP_ID" value="tg-book"/>--> <springProperty name="LOG_PATH" source="log.path"/> <springProperty name="APP_ID" source="app.id"/>
- 修改
application.properties
文件,新增log.path和app.id配置:
app.id=tg-book log.path=d:/logs/
三、动态指定日志级别
可以在application.properties文件中设置logging.level.包路径=日志级别
来更改日志级别!
- 例如,修改包org.tg.book.dal.mapper的日志级别=debug
logging.level.org.tg.book.dal.mapper = debug
此时,我们调用login接口,将输出debug级别的mybatis的sql日志,如下图:
也可以修改root的日志级别
logging.level.root= warn
此时,所有包,将只输出warn、error级别日志。
四、指定配置文件
可以在application.properties文件中设置logging.config=classpath:logback-spring-2.xml
来指定配置文件,如果不指定默认就是classpath:logback-spring.xml!
五、滚动记录RollingFIleAppender
RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个策略条件时,将日志记录到其余文件。
我们新增一个RollingFileAppender,并修改root的appender-ref,详细如下:
<!-- 把日志滚动输出到各文件 --> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> <charset>UTF-8</charset> </encoder> <file>${LOG_PATH}/${APP_ID}-rolling.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APP_ID}-%d{yyyyMMdd}-%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <!-- 文件最大大小,可能会超出 --> <maxHistory>30</maxHistory> <!-- 保存30天 --> <totalSizeCap>10GB</totalSizeCap><!-- 总日志大小 --> </rollingPolicy> </appender> <root level="info"> <appender-ref ref="STDOUT"/> <appender-ref ref="ROLLING_FILE"/> </root>
SizeAndTimeBasedRollingPolicy是常用的滚动策略,配置节点说明如下:
- maxFileSize:当D:\logs\tg-book-rolling.log文件达到100MB以后,会自动创建新文件!测试时,你可以指定maxFileSize小一点,比如100KB。
- maxHistory:最大保存多长时间,单位是天
- totalSizeCap:总日志大小
六、异步记录AsyncAppender
AsyncAppender可以将日志消息异步地发送到目标Appender,以提高应用程序的性能和响应速度。
我们新增两个AsyncAppender,一个指定控制台,一个指定文件,如下:
<!-- 把日志异步输出到控制台 --> <appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender"> <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 --> <discardingThreshold>0</discardingThreshold> <!-- 队列的大小, 默认值为256 --> <queueSize>1024</queueSize> <!-- 队列满了不阻塞调用者--> <neverBlock>true</neverBlock> <!-- 异步打印堆栈信息不丢失--> <includeCallerData>true</includeCallerData> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="STDOUT"/> </appender> <!-- 把日志异步滚动输出到文件 --> <appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 --> <discardingThreshold>0</discardingThreshold> <!-- 队列的大小, 默认值为256 --> <queueSize>1024</queueSize> <!-- 队列满了不阻塞调用者--> <neverBlock>true</neverBlock> <!-- 异步打印堆栈信息不丢失--> <includeCallerData>true</includeCallerData> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="ROLLING_FILE"/> </appender> <!-- 大于等于info级别的才会输出 --> <root level="info"> <!--<appender-ref ref="STDOUT"/> <appender-ref ref="ROLLING_FILE"/>--> <appender-ref ref="ASYNC-STDOUT"/> <appender-ref ref="ASYNC-FILE"/> </root>
AsyncAppender具有以下参数:
- QueueSize:指定用于暂存消息的BlockingQueue队列的大小。默认值为256。
- DiscardingThreshold:指定队列满载时,消息将被丢弃的数量。默认值为0。
- NeverBlock:指定当队列已满时,是否阻止应用程序运行。如果设置为true,当队列已满时,应用程序将继续运行,但消息可能会丢失。默认值为false。
- IncludeCallerData:指定是否在记录器中包含调用者信息。默认值为false。
- AppenderRef:指定一个或多个目标Appender引用的列表。每个引用都必须引用一个已定义的Appender。
- DiscardingThresholdPolicyClassName:指定当队列满时,应采取的策略类的名称。默认使用的是DiscardingThresholdPolicy类。
- QueueFullPolicyClassName:指定当队列已满时,应采取的策略类的名称。默认使用的是DiscardingQueueFullPolicy类。
总结
最终的logback-spring.xml
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 定义属性,可以通过“${}”来使用属性 --> <!--<property name="LOG_PATH" value="d:/logs/"/> <property name="APP_ID" value="tg-book"/>--> <springProperty name="LOG_PATH" source="log.path"/> <springProperty name="APP_ID" source="app.id"/> <!-- 把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> </encoder> </appender> <!-- 把日志输出到文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> <charset>UTF-8</charset> </encoder> <file>${LOG_PATH}/${APP_ID}.log</file> </appender> <!-- 把日志滚动输出到各文件 --> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{36} %L - %msg%xEx%n</pattern> <charset>UTF-8</charset> </encoder> <file>${LOG_PATH}/${APP_ID}-rolling.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APP_ID}-%d{yyyyMMdd}-%i.log</fileNamePattern> <maxFileSize>500KB</maxFileSize> <!-- 文件最大大小,可能会超出 --> <maxHistory>30</maxHistory> <!-- 保存30天 --> <totalSizeCap>10GB</totalSizeCap><!-- 总日志大小 --> </rollingPolicy> </appender> <!-- 把日志异步输出到控制台 --> <appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender"> <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 --> <discardingThreshold>0</discardingThreshold> <!-- 队列的大小, 默认值为256 --> <queueSize>1024</queueSize> <!-- 队列满了不阻塞调用者--> <neverBlock>true</neverBlock> <!-- 异步打印堆栈信息不丢失--> <includeCallerData>true</includeCallerData> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="STDOUT"/> </appender> <!-- 把日志异步滚动输出到文件 --> <appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 指定队列满载时,消息将被丢弃的数量, 默认值为0 --> <discardingThreshold>0</discardingThreshold> <!-- 队列的大小, 默认值为256 --> <queueSize>1024</queueSize> <!-- 队列满了不阻塞调用者--> <neverBlock>true</neverBlock> <!-- 异步打印堆栈信息不丢失--> <includeCallerData>true</includeCallerData> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="ROLLING_FILE"/> </appender> <!-- 大于等于info级别的才会输出 --> <root level="info"> <!--<appender-ref ref="STDOUT"/> <appender-ref ref="ROLLING_FILE"/>--> <appender-ref ref="ASYNC-STDOUT"/> <appender-ref ref="ASYNC-FILE"/> </root> </configuration>
application.properties
增加配置:
#logging.config=classpath:logback-spring.xml app.id=tg-book log.path=d:/logs/ logging.level.root = info #logging.level.org.tg.book.dal.mapper = debug
到此这篇关于SpringBoot日志进阶实战 Logback配置详解的文章就介绍到这了,更多相关SpringBoot Logback配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!