SpringBoot日志进阶实战之Logback配置经验和方法

 更新时间:2023年06月02日 10:47:50   作者:天罡gg  
本文给大家介绍在SpringBoot中使用Logback配置日志的经验和方法,并提供了详细的代码示例和解释,包括:滚动文件、异步日志记录、动态指定属性、日志级别、配置文件等常用功能,覆盖日常Logback配置开发90%的知识点,感兴趣的朋友跟随小编一起看看吧

前言

在上一篇文章中,我和你介绍了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中。

常用节点的解释:

  1. configuration:根节点,包含所有配置信息。
  2. property:定义属性,可以通过“${}”来使用属性
  3. appender:定义输出器的名称、类型、编码、日志输出路径等信息。
  • class=“ch.qos.logback.core.ConsoleAppender”:输出到控制台
  • class=“ch.qos.logback.core.FileAppender”:输出到文件
  1. 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配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的内存模型(JMM)和锁机制详解

    Java中的内存模型(JMM)和锁机制详解

    这篇文章主要介绍了Java中的内存模型(JMM)和锁机制使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java代码发送post请求实现方式

    Java代码发送post请求实现方式

    本文介绍了使用Java发送POST请求的方法,包括引用工具类、设置访问地址、请求头和json请求体,最后使用工具类发送请求并返回结果
    2026-05-05
  • 使用springboot+druid双数据源动态配置操作

    使用springboot+druid双数据源动态配置操作

    这篇文章主要介绍了使用springboot+druid双数据源动态配置的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot整合SpringDataRedis的示例代码

    SpringBoot整合SpringDataRedis的示例代码

    这篇文章主要介绍了SpringBoot整合SpringDataRedis的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java DWR内存泄漏问题解决方案

    Java DWR内存泄漏问题解决方案

    这篇文章主要介绍了Java DWR内存泄漏问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • springboot 整合 seata的配置过程

    springboot 整合 seata的配置过程

    本文给大家介绍springboot 整合 seata的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • 解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)

    解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)

    这篇文章主要介绍了解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中使用 @Builder 注解的简单示例

    Java中使用 @Builder 注解的简单示例

    @Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@Getter更佳,本文给大家介绍到底应不应该使用@Builder的相关知识,感兴趣的朋友一起看看吧
    2025-07-07
  • SpringBoot项目中的视图解析器问题(两种)

    SpringBoot项目中的视图解析器问题(两种)

    SpringBoot官网推荐使用HTML视图解析器,但是根据个人的具体业务也有可能使用到JSP视图解析器,所以本文介绍了两种视图解析器,感兴趣的可以了解下
    2020-06-06
  • Java中的System.getProperty()详解

    Java中的System.getProperty()详解

    System.getProperty("XXX")方法用来读取JVM中的系统属性,那么java 虚拟机中的系统属性使用在运行java程序的时候java -D配置,有两种方式,一种是在命令行配置另一种是在IDE中配置,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-09-09

最新评论