Spring Boot 使用logback管理日志


Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util LoggingLog4J, Log4J2Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。

下面记录一下spring boot中如何按照日志等级拆分,输出到不同文件并做归档处理

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="2000" debug="false">

    <!--
    scan:
    当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。(这个功能可以在不重启运行环境下,调整打印日志的细节,方便定位问题)
    scanPeriod:
    设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:
    当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

    Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR

    级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
    -->

    <!-- springProperty 可以读取application.properties文件中的属性值,只有当logback文件名为logback-spring时,该配置才会生效 -->
    <springProperty scope="context" name="app.name" source="spring.application.name"/>
    <springProperty scope="context" name="log.home" source="logging.home"/>

    <!-- 配置是logback默认的 -->
    <!--<property name="log.home" value="${user.dir}/logs"/>-->

    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
    <!-- appender是configuration的子节点,是负责写日志的组件。 -->
    <!-- ConsoleAppender:把日志输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{ISO8601} [%thread] %-5level [${app.name}] [%logger{50}] [%file:%line] - %msg%n</pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- info level -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/${app.name}.log</file>
        <encoder>
            <pattern>%date{ISO8601} [%thread] %-5level [${app.name}] [%logger{50}] [%file:%line] - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.home}/${app.name}.info.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
            <!-- 如果按天来回滚,则最大保存时间为10天,10天之前的都将被清理掉 -->
            <maxHistory>10</maxHistory>
            <!-- 日志总保存量为500MB -->
            <totalSizeCap>500MB</totalSizeCap>
            <!--文件达到最大50MB时会被压缩和切割 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大50MB时会被压缩和切割 -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--<maxFileSize>50MB</maxFileSize>-->
        </rollingPolicy>
    </appender>

    <!-- debug level -->
    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/${app.name}.debug.log</file>
        <encoder>
            <pattern>%date{ISO8601} [%thread] %-5level [${app.name}] [%logger{50}] [%file:%line] - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.home}/${app.name}.debug.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
            <!-- 如果按天来回滚,则最大保存时间为10天,10天之前的都将被清理掉 -->
            <maxHistory>10</maxHistory>
            <!-- 日志总保存量为500MB -->
            <totalSizeCap>500MB</totalSizeCap>
            <!--文件达到最大50MB时会被压缩和切割 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大50MB时会被压缩和切割 -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--<maxFileSize>50MB</maxFileSize>-->
        </rollingPolicy>
    </appender>

    <!-- warn level -->
    <appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/${app.name}.warn.log</file>
        <encoder>
            <pattern>%date{ISO8601} [%thread] %-5level [${app.name}] [%logger{100}] [%file:%line] - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.home}/${app.name}.warn.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
            <!-- 如果按天来回滚,则最大保存时间为10天,10天之前的都将被清理掉 -->
            <maxHistory>10</maxHistory>
            <!-- 日志总保存量为500MB -->
            <totalSizeCap>500MB</totalSizeCap>
            <!--文件达到最大50MB时会被压缩和切割 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大50MB时会被压缩和切割 -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--<maxFileSize>50MB</maxFileSize>-->
        </rollingPolicy>
    </appender>

    <!-- error level -->
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/${app.name}.error.log</file>
        <encoder>
            <pattern>%date{ISO8601} [%thread] %-5level [${app.name}] [%logger{100}] [%file:%line] - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.home}/${app.name}.error.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
            <!-- 如果按天来回滚,则最大保存时间为10天,10天之前的都将被清理掉 -->
            <maxHistory>10</maxHistory>
            <!-- 日志总保存量为500MB -->
            <totalSizeCap>500MB</totalSizeCap>
            <!--文件达到最大50MB时会被压缩和切割 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大50MB时会被压缩和切割 -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--<maxFileSize>50MB</maxFileSize>-->
        </rollingPolicy>
    </appender>


    <!-- level Options: ERROR, WARN, INFO, DEBUG -->
    <!--
    logger:日志所处的包或者具体的类
    level:日志打印级别
    -->
    <logger name="com.zaxxer.hikari" level="WARN"/>
    <logger name="com.example.LogbackApplication" level="INFO"/>

    <root level="INFO">  <!-- Options: ERROR, WARN, INFO, DEBUG -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="file_debug"/>
        <appender-ref ref="file_info"/>
        <appender-ref ref="file_warn"/>
        <appender-ref ref="file_error"/>
    </root>
</configuration>


文章作者: 阿牛
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 阿牛 !
评论
  目录