springboot日志歸檔

logback-spring.xml配置示例(主要是文件歸檔)

<?xml version="1.0" encoding="utf-8"?>
<!--
根節(jié)點(diǎn)<configuration>,包含下面三個(gè)屬性:
scan: 當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod: 設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug: 當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
-->
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback
                https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
    <!-- 從 application.yaml 中獲取應(yīng)用名稱 -->
    <springProperty name="appName" source="spring.application.name" defaultValue="defaultAppName" />

    <property name="log-pattern" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } [%10.10t] %-40.40logger{39} : %m%n"/>

    <!-- 定義控制臺(tái)輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 定義保存文件滾動(dòng)策略 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./log/%d{yyyy-MM-dd}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
            <totalSizeCap>100GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- 將控制臺(tái)輸出和保存文件兩個(gè) appender 綁定到 root logger -->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

每個(gè)日志文件的最大大小為 10MB,最大歷史文件數(shù)量為 30 個(gè),總存儲(chǔ)空間上限為 100GB。每天會(huì)生成一個(gè)新的子目錄,子目錄的命名格式為 yyyy-MM-dd

注:
springboot默認(rèn)的日志輸出格式如下,其中包含了彩色字體渲染,上面的logback-spring.xml使用了springboot的默認(rèn)格式,但是去掉了彩色渲染

%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

2023.08.08更新
使用異步Appender包裝

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback
                https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
    <!-- 根節(jié)點(diǎn)配置 -->
    <springProperty name="appName" source="spring.application.name" defaultValue="defaultAppName" />
    <property name="log-pattern" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } [%10.10t] %-40.40logger{39} : %m%n" />

    <!-- 定義異步Appender -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
        <!--
        指定異步隊(duì)列的大小,即可以容納的最大未處理的日志消息數(shù)量。當(dāng)隊(duì)列滿時(shí),新的日志消息將被阻塞或丟棄,取決于discardingThreshold的配置。在這里,隊(duì)列大小設(shè)置為512
        -->
        <queueSize>512</queueSize>

        <!--
        指定當(dāng)隊(duì)列已滿時(shí)的丟棄閾值。當(dāng)隊(duì)列中未處理的日志消息數(shù)量達(dá)到丟棄閾值時(shí),新的日志消息將被丟棄。discardingThreshold的值可以是正整數(shù)或者-1,表示不丟棄任何日志消息。在這里,丟棄閾值設(shè)置為0,即當(dāng)隊(duì)列已滿時(shí),不會(huì)丟棄任何日志消息。
        -->
        <discardingThreshold>0</discardingThreshold>
    </appender>

    <!-- 定義控制臺(tái)輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 定義保存文件滾動(dòng)策略 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./log/%d{yyyy-MM-dd}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>20</maxHistory>
            <totalSizeCap>10MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 將異步Appender和控制臺(tái)輸出Appender綁定到root logger -->
    <root level="info">
        <appender-ref ref="ASYNC" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

參考
logback異步日志AsyncAppender配置_loophome的博客-CSDN博客

=======================

2024.1.3更新
可以直接引入spring的defaults.xml,使用其定義的變量,如控制臺(tái)輸出格式 ${CONSOLE_LOG_PATTERN}

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

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <springProperty scope="context" name="application.name" source="spring.application.name"/>

    <!--輸出到控制臺(tái)-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 設(shè)置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
    </root>

</configuration>

3.15更新
warn級(jí)別以上的日志單獨(dú)保存到另外文件
需要使用新的AsyncAppender

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">>
    <!-- 根節(jié)點(diǎn)配置 -->
    <springProperty name="appName" source="spring.application.name" defaultValue="defaultAppName" />

    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="log-pattern" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } [%10.10t] %-40.40logger{39} : %m%n" />

    <!-- 定義控制臺(tái)輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 定義保存文件滾動(dòng)策略 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./log/%d{yyyy-MM-dd}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15</maxHistory>
            <totalSizeCap>1000MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 定義保存文件滾動(dòng)策略 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/error/${appName}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./log/error/%d{yyyy-MM-dd}/${appName}-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15</maxHistory>
            <totalSizeCap>1000MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${log-pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- warn error級(jí)別 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 定義異步Appender -->
    <appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
        <appender-ref ref="ERROR_FILE" />
        <!--
        指定異步隊(duì)列的大小,即可以容納的最大未處理的日志消息數(shù)量。當(dāng)隊(duì)列滿時(shí),新的日志消息將被阻塞或丟棄,取決于discardingThreshold的配置。在這里,隊(duì)列大小設(shè)置為512
        -->
        <queueSize>512</queueSize>

        <!--
        指定當(dāng)隊(duì)列已滿時(shí)的丟棄閾值。當(dāng)隊(duì)列中未處理的日志消息數(shù)量達(dá)到丟棄閾值時(shí),新的日志消息將被丟棄。discardingThreshold的值可以是正整數(shù)或者-1,表示不丟棄任何日志消息。在這里,丟棄閾值設(shè)置為0,即當(dāng)隊(duì)列已滿時(shí),不會(huì)丟棄任何日志消息。
        -->
        <discardingThreshold>0</discardingThreshold>
    </appender>

    <!-- 定義異步Appender -->
    <appender name="ERROR_FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="ERROR_FILE" />
        <!--
        指定異步隊(duì)列的大小,即可以容納的最大未處理的日志消息數(shù)量。當(dāng)隊(duì)列滿時(shí),新的日志消息將被阻塞或丟棄,取決于discardingThreshold的配置。在這里,隊(duì)列大小設(shè)置為512
        -->
        <queueSize>512</queueSize>

        <!--
        指定當(dāng)隊(duì)列已滿時(shí)的丟棄閾值。當(dāng)隊(duì)列中未處理的日志消息數(shù)量達(dá)到丟棄閾值時(shí),新的日志消息將被丟棄。discardingThreshold的值可以是正整數(shù)或者-1,表示不丟棄任何日志消息。在這里,丟棄閾值設(shè)置為0,即當(dāng)隊(duì)列已滿時(shí),不會(huì)丟棄任何日志消息。
        -->
        <discardingThreshold>0</discardingThreshold>
    </appender>

    <!-- 將異步Appender和控制臺(tái)輸出Appender綁定到root logger -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ASYNC" />
        <appender-ref ref="ERROR_FILE_ASYNC" />
    </root>
</configuration>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容