SpringBoot使用logback

本文详细介绍SpringBoot中logback的高级配置方法,包括多级日志文件划分、日志滚动策略及特定包的日志级别设定等。适用于需要精细化管理应用日志的企业级项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot中,默认使用slf4j + logback方式进行日志输出,并且引入了commons-logging,jul,log4j的适配包,将其他第三方框架的日志替换为slf4j作为日志门面,然后引入logback作为日志实现,这样就能统一使用slf4j(日志门面) + logback(日志实现)

logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level: 级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
    <property name="logHome" value="D:/2022/logs/"></property>
    <!--Appender: 设置日志信息的去向,常用的有以下几个 ch.qos.logback.core.ConsoleAppender (控制台) ch.qos.logback.core.rolling.RollingFileAppender (文件 大小到达指定尺寸的时候产生一个新文件) ch.qos.logback.core.FileAppender (文件) -->
    <!--   定义可能用到的appender,控制台输出-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--    文件输出appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>${logHome}logback.log</file>
        <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--        全局的级别是info以上的,这里我们让文件只输出warn和error-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置拦截日志级别-->
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
        </filter>
        <!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--            &lt;!&ndash;设置拦截日志级别&ndash;&gt;-->
        <!--            <level>error</level>-->
        <!--            <onMatch>ACCEPT</onMatch>-->
        <!--        </filter>-->
    </appender>


    <!--    滚动日志文件-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志输出路径-->
        <file>${logHome}roll_logback.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式-->
<!--            日志文件超过指定大小时进行的压缩规则,此处的规则为按照日志形成文件夹归档-->
            <fileNamePattern>${logHome}%d{yyyy-MM-dd}/info.log%i.gz</fileNamePattern> <!--文件拆分大小-->
<!--            日志文件超过1MB时或日期更新会压缩一次,压缩格式按fileNamePattern-->
            <maxFileSize>100KB</maxFileSize>
<!--            最多保留3天的日志,超过3天的日志自动删除-->
            <maxHistory>3</maxHistory>
        </rollingPolicy> <!--filter配置-->
    </appender>


    <!--    全局日志级别为info以及以上-->
    <root level="INFO">
        <!--        全局日志使用的日志Appender(处理器)-->
        <appender-ref ref="console"></appender-ref>
<!--        <appender-ref ref="file"></appender-ref>-->
        <appender-ref ref="rollFile"></appender-ref>
    </root>

<!--    为某个包单独设置级别-->
    <logger name="com.example.springboot01.mapper" level="debug">
<!--        此时由于这个logger会继承rootlogger的配置,所以会造成日志重复打印
            使用additive false设置当前logger不继承父级logger-->
        <additive>false</additive>
        <appender-ref ref="console"></appender-ref>
    </logger>

</configuration>

logback组件

  • property 定义属性相关,方便其他标签引用

  • appender 定义具体的日志输出appender,类似于JUL的handler,logback也提供了ConsoleAppender和FileAppender

  • encoder 指定当前appender输出时的格式

  • filter 可在appender中配置filter,设置日志过滤,比如可根据日志级别进行过滤

  • root root标签是指定rootLogger的配置,level指定rootLogger的默认运行级别,通过append-ref来指定rootLogger拥有的appender。然后其他的创建的logger都会继承rootLogger的配置。

  • logger 为某个包单独设置级别或者appender,如需要查看mapper包打印的sql,则可以将mapper调整为debug级别

  • additive 通常使用在logger中,如果我们为某个包单独指定了配置,而这个包的配置又会继承rootlogger的配置,所以可能会造成这个包下的日志会有重复打印。使用additive = false,表示不继承上级日志配置,去掉重复的日志打印。

定制化logback

需求:使用控制台和滚动日志追加器来实现info级别日志输出, 滚动日志追加器需要进行归档,每天一个文件夹,且超过100KB自动压缩, debug。warn。info要分文件夹,如 2021-11-18/debug/xxx.log, 2021-11-18/warn/xxx.log,2021-11-18/info/xxx.log.同时mapper包下的日志使用trace级别,不继承rootLogger配置,只使用控制台输出。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <property name="pattern"
              value="%d{[yyyy-MM-dd HH:mm:ss]} [%c] [%thread] [%-5level] %msg%n"/>
    <property name="logHome" value="D:/2022/logs/"></property>
    <property name="size" value="20KB"></property>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <appender name="errorRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <file>${logHome}system-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>${logHome}%d{yyyy-MM-dd}/error/error.log%i.gz</fileNamePattern> <!--文件拆分大小-->
            <maxFileSize>${size}</maxFileSize>
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置拦截日志级别-->
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="warnRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <file>${logHome}system-warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>${logHome}%d{yyyy-MM-dd}/warn/warn.log%i.gz</fileNamePattern> <!--文件拆分大小-->
            <maxFileSize>${size}</maxFileSize>
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置拦截日志级别-->
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="infoRollFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <file>${logHome}system-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>${logHome}%d{yyyy-MM-dd}/info/info.log%i.gz</fileNamePattern> <!--文件拆分大小-->
            <maxFileSize>${size}</maxFileSize>
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置拦截日志级别-->
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

<!--    全局的日志级别以及日志追加器-->
    <root level="info">
        <appender-ref ref="console"></appender-ref>
<!--        <appender-ref ref="rollFile"></appender-ref>-->
        <appender-ref ref="errorRollFile"></appender-ref>
        <appender-ref ref="warnRollFile"></appender-ref>
        <appender-ref ref="infoRollFile"></appender-ref>

    </root>

<!--    为mapper包单独设置日志级别以及appender 不继承root-->
    <logger name="com.example.springboot01.mapper" level="trace">
<!--        只在控制台输出,不继承上级logger配置-->
        <additive>false</additive>
        <appender-ref ref="console"></appender-ref>
    </logger>

</configuration>
### 配置 Logback 进行日志记录 在 Spring Boot 项目中,为了配置 Logback 来实现日志记录,可以采用多种方法来定制化日志行为。一种常见的做法是在 `application.yml` 文件内指定日志文件路径和其他基本参数[^1]。 #### 使用默认命名的配置文件 按照最佳实践建议,在项目资源目录下创建名为 `logback-spring.xml` 的文件用于定义具体的日志策略[^3]。此文件允许更细粒度地控制不同包下的类的日志输出格式、等级及目的地等属性。 ```xml <configuration> <!-- 定义日志输出位置 --> <property name="LOG_PATH" value="${logging.file.path}"/> <!-- 控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 文件输出 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/root.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件按天滚动存储 --> <fileNamePattern>${LOG_PATH}/archived/root.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <!-- 设置根日志级别并关联到两个输出端 --> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration> ``` 上述 XML 片段展示了如何设置控制台和文件两种类型的 appender,并指定了它们各自的编码模式与滚动策略。同时设置了应用程序的整体日志级别为 info 并将其发送至这两个目标之一或两者皆有[^2]。 对于希望进一步调整的地方,比如改变特定包的日志级别或是引入更多复杂的过滤器逻辑,则可以根据实际需求修改相应的节点内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值