springboot2.0 整合 logback 日志

该博客主要介绍 Spring Boot 2.0 整合 Logback 日志的相关内容,包括 logback - spring.xml 文件配置、logback 异步日志配置,还提及 Logback 中自定义灵活日志过滤规则及参考官方文档中过滤器章节。

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

springboot2.0 整合 logback 日志

1. logback-spring.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 
    	日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL, 如果设置为WARN, 则低于WARN的信息都不会输出 
    -->
    <!-- 
    scan: 当此属性设置为true时, 配置文件如果发生改变, 将会被重新加载, 默认值为true
    scanPeriod: 设置监测配置文件是否有修改的时间间隔, 如果没有给出时间单位, 默认单位是毫秒. 当scan为true时, 此属性生效. 默认的时间间隔为1分钟
    debug: 当此属性设置为true时, 将打印出logback内部日志信息, 实时查看logback运行状态. 默认值为false 
    -->
    <configuration scan="true" scanPeriod="10 seconds">
    
        <contextName>logback</contextName>
    
        <!-- 定义变量, 日志的根目录 -->
        <property name="logging.path" value="C:/log" />
        <property name="logging.file.prev" value="aal-" />
        <property name="max.file.size" value="1KB" />
        <property name="max.file.history" value="30" />
        <property name="charset" value="UTF-8" />
    
    
    
        <!-- %m输出的信息, %p日志级别, %t线程名, %d日期, %c类的全名, %i索引【从数字0开始递增】 -->
        <!-- appender是configuration的子节点, 是负责写日志的组件 -->
        <!-- ConsoleAppender:把日志输出到控制台 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d %p (%file: %line\)- %m%n</pattern>
                <!-- 控制台也要使用UTF-8, 不要使用GBK, 否则会中文乱码 -->
                <charset>${charset}</charset>
            </encoder>
        </appender>
    
    
        <!-- RollingFileAppender: 滚动记录文件, 先将日志记录到指定文件, 当符合某个条件时, 将日志记录到其他文件 -->
    	<!-- 
    	以下的大概意思是: 
    	1.先按日期存日志, 日期变了, 将前一天的日志文件名重命名为XXX%日期%索引, 新的日志仍然是demo.log 
    	2.如果日期没有发生变化, 但是当前日志的文件大小超过1KB时, 对当前日志进行分割 重命名
    	-->
        <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logging.path}/${logging.file.prev}debug.log</File>
            <!-- rollingPolicy: 当发生滚动时, 决定 RollingFileAppender 的行为, 涉及文件移动和重命名.  -->
            <!-- TimeBasedRollingPolicy:  最常用的滚动策略, 它根据时间来制定滚动策略, 既负责滚动也负责出发滚动 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 活动文件的名字会根据fileNamePattern的值, 每隔一段时间改变一次 -->
                <!-- 文件名: 2019-04-09/aal-debug_0.log -->
                <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}/${logging.file.prev}debug_%i.log</fileNamePattern>
                <!-- 每产生一个日志文件, 该日志文件的保存期限为30天 -->
                <maxHistory>${max.file.history}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!-- maxFileSize: 这是活动文件的大小, 默认值是10MB, 测试时可改成1KB看效果 -->
                    <maxFileSize>${max.file.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
                <!-- pattern节点, 用来设置日志的输入格式 -->
                <!--格式化输出: %d表示日期, %thread表示线程名, %-5level: 级别从左显示5个字符宽度%msg: 日志消息, %n是换行符-->
                <!--<pattern>%d %p (%file: %line\)- %m%n</pattern>-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%line] - %msg%n</pattern>
                <!--<pattern> %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n</pattern>-->
    
                <!-- 记录日志的编码: 此处设置字符集 - -->
                <charset>${charset}</charset>
            </encoder>
            <!-- 此日志文件只记录 debug 级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>DEBUG</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
    
        <!-- 时间滚动输出 level 为 info 日志 -->
        <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logging.path}/${logging.file.prev}info.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}/${logging.file.prev}info_%i.log</fileNamePattern>
                <maxHistory>${max.file.history}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${max.file.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%line] - %msg%n</pattern>
                <charset>${charset}</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
    
        <!-- 时间滚动输出 level 为 warn 日志 -->
        <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logging.path}/${logging.file.prev}warn.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}/${logging.file.prev}warn_%i.log</fileNamePattern>
                <maxHistory>${max.file.history}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${max.file.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
            	<!-- 输出行号: %line -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%line] - %msg%n</pattern>
                <charset>${charset}</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
    
        <!-- 时间滚动输出 level 为 error 日志 -->
        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${logging.path}/${logging.file.prev}error.log</File>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${logging.path}/%d{yyyy-MM-dd}/${logging.file.prev}error%i.log</fileNamePattern>
                <maxHistory>${max.file.history}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${max.file.size}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%line] - %msg%n</pattern>
                <charset>${charset}</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
    
    
    
        <!-- 日志输出级别 -->
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_DEBUG" />
            <appender-ref ref="FILE_INFO" />
            <appender-ref ref="FILE_WARN" />
            <appender-ref ref="FILE_ERROR" />
        </root>
    
        <!-- 设置 prod 环境, 发生在 com.answer.aal 根包下只打印 error 日志  -->
        <springProfile name="prod">
            <logger name="com.answer.aal" level="error"/>
        </springProfile>
    
        <!-- 设置 dev 环境日志输出级别 -->
        <springProfile name="dev">
            <root level="info">
                <appender-ref ref="CONSOLE"/>
                <appender-ref ref="FILE_DEBUG"/>
                <appender-ref ref="FILE_INFO"/>
                <appender-ref ref="FILE_WARN"/>
                <appender-ref ref="FILE_ERROR"/>
            </root>
        </springProfile>
    
    </configuration>

 

2. logback 异步日志配置

<?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true" scan="true" scanPeriod="30 seconds">
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern>
            </encoder>
        </appender>
    
        <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>c:/log/info-%d{yyyyMMdd}_%i.log</FileNamePattern>
                <MaxHistory>180</MaxHistory>
                <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>1KB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
                <!--<pattern>%d{HH:mm:ss.SSS} %thread %X{invokeNo} %logger{40} %msg%n</pattern>-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%line] - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!--只输出 INFO 级别日志-->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--异步输出-->
        <appender name="ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">
            <discardingThreshold>0</discardingThreshold>
            <queueSize>10</queueSize>
            <appender-ref ref="FILE_INFO"/>
        </appender>
    
        <!-- 日志输出级别 -->
        <root level="info">
            <appender-ref ref="ASYNC_LOG"/>
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE_INFO"/>
        </root>
    </configuration>

 

3. logback-spring.xml - 2

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

    <property name="LOGS" value="./logs" />
	
	<!-- 设置spring变量, 使用: %clr([${active}]) -->
    <springProperty scope="context" name="active" source="spring.profiles.active" />
    <springProperty scope="context" name="appName" source="spring.application.name" />

    <contextName>${appName}</contextName>

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([${HOSTNAME}]) %clr([${appName}]) %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint}[%line] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- Console 输出设置 -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOGS}/${appName}.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d ${HOSTNAME} [${appName}] %p %C{1.} [%t] %m%n</Pattern>
            <charset>${charset}</charset>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOGS}/archived/${appName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <totalSizeCap>10GB</totalSizeCap>
            <maxHistory>31</maxHistory>
        </rollingPolicy>

    </appender>

    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.answer.ai at DEBUG level -->
    <logger name="com.answer.ai" level="debug" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

 

References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jaemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值