最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Springboot中處理log4j2日志文件過程

 更新時間:2026年01月09日 14:57:30   作者:記錄Java學習的三木  
日志切割、分離和清理是日志管理的重要環(huán)節(jié),本文介紹了在SpringBoot項目中配置日志切割、分離和清理的步驟,并詳細解釋了實現(xiàn)原理

簡單介紹

日志切割

日志切割指的是將一個持續(xù)增長的、龐大的日志文件,按照某種規(guī)則分割成多個較小的、易于管理的文件。(在本配置中我們將日志按天切割,同時限制了單個日志文件不能超過64MB)

效果如圖:

切割策略有兩個,每天零點會將昨天的日志文件加日期保存然后生成一個新的日志文件,當天如果單個日志文件超出規(guī)定(例如本配置的64MB),會自動將此日志文件加日期保存并生成一個新的日志文件

日志分離

日志分離指的是將不同種類、不同級別或來自不同模塊的日志信息,輸出到不同的、獨立的日志文件中。

效果如圖:

日志被根據不同級別分層保存

日志清理

日志清理指的是自動刪除舊的、不再需要的日志歸檔文件,以防止日志文件無限制地占用磁盤空間,最終導致磁盤寫滿。

這是生產環(huán)境中至關重要的一環(huán)。(比如本配置的清理就是會刪除超過N(比如Info30天,Warn60天,Error90天)天的日志歸檔文件以及每個類型的日志文件總大小不超過某個GB的大?。ū热鏘nfo6GB,Warn3GB,Error2GB))

如何在SpringBoot項目中配置使用

第一步,導入如下依賴到pom.xml文件當中

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

第二步,在yaml文件中添加如下配置

logging:
  config: classpath:log4j2.xml

第三步,將xml文件放到resource目錄下,下次啟動項目,日志會自動被記錄到logs目錄(這個目錄會在項目啟動時自動生成)并分離清洗

xml文件名: log4j2.xml

文件代碼:

<Configuration status="WARN">
    <Properties>
        <Property name="LOG_PATH">logs</Property>
        <Property name="APP_NAME">app</Property>
        <Property name="FILE_SIZE">64MB</Property>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c{1.} [%X{traceId:-}] - %m%n%ex</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <RollingFile name="InfoFile" fileName="${LOG_PATH}/${APP_NAME}-info.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <LevelMatchFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <max>64</max>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-info*.log"/>
                    <IfLastModified age="30d"/>
                </Delete>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-info*.log"/>
                    <IfAccumulatedFileSize exceeds="6GB"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="WarnFile" fileName="${LOG_PATH}/${APP_NAME}-warn.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <LevelMatchFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <max>64</max>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-warn*.log"/>
                    <IfLastModified age="60d"/>
                </Delete>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-warn*.log"/>
                    <IfAccumulatedFileSize exceeds="3GB"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="ErrorFile" fileName="${LOG_PATH}/${APP_NAME}-error.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <LevelMatchFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <max>64</max>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-error*.log"/>
                    <IfLastModified age="90d"/>
                </Delete>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-error*.log"/>
                    <IfAccumulatedFileSize exceeds="2GB"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="DebugFile" fileName="${LOG_PATH}/${APP_NAME}-debug.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-debug-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <LevelMatchFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy>
                <max>64</max>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-debug*.log"/>
                    <IfLastModified age="7d"/>
                </Delete>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-debug*.log"/>
                    <IfAccumulatedFileSize exceeds="5GB"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="InfoFile"/>
            <AppenderRef ref="WarnFile"/>
            <AppenderRef ref="ErrorFile"/>
        </Logger>
        <Logger name="org.hibernate" level="warn"/>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="InfoFile"/>
            <AppenderRef ref="WarnFile"/>
            <AppenderRef ref="ErrorFile"/>
        </Root>
    </Loggers>
</Configuration>

實現(xiàn)原理

日志切割

Appender 就是日志的輸出目的地。Appender 中的 RollingFile都設置了兩種觸發(fā)策略,它們之間是“或”的關系,只要滿足任一條件,就會觸發(fā)日志切割

  • <TimeBasedTriggeringPolicy/> 基于時間滾動,每天零點自動生成新的日志文件
  • <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/> 基于文件大小的觸發(fā)策略。

參數 ${FILE_SIZE}被定義為 64MB。

這意味著,即使在同一天內,只要當前正在寫入的日志文件大小達到 64MB,也會立即觸發(fā)切割,并生成一個新的日志文件 。

            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
            </Policies>

日志的分離

可以看到,在Appenders中RollingFile被分為了四種,分別是Info,Warn,Error,Debug級別的文件

當日志文件被切割后,其歸檔文件的命名和存放位置由 filePattern屬性精確控制:

filePattern="${LOG_PATH}/$${date:yyyy-MM}/${APP_NAME}-info-%d{yyyy-MM-dd}-%i.log.gz"

這個配置實現(xiàn)了以下效果:

  • 按月份歸檔$${date:yyyy-MM}會在 logs目錄下自動創(chuàng)建像 2025-03這樣的子文件夾,將當月所有的歸檔日志文件放入其中,使目錄結構非常清晰 。。
  • 索引區(qū)分:當同一天內因文件大小觸發(fā)多次切割時,%i是一個從1開始遞增的索引號,用于區(qū)分同一天產生的不同日志文件,例如會產生 app-info-2025-03-18-1.log,app-info-2025-03-18-2.log等文件。

日志清理

日志清理有三個策略

<max>64</max>在這里表示:當天最多可以生成 64 個歸檔日志文件(例如 app-info-2025-10-15-1.log.gzapp-info-2025-10-15-64.log.gz)。

當同一天內的第 65 次滾動觸發(fā)時,最早的那個文件(如 ...-1.log.gz)將會被刪除 。

<IfFileName glob="*/app-info*.log"/>
<IfLastModified age="30d"/>

這個代表如果超過30天會把info類型的最舊日志刪除

<IfFileName glob="*/app-info*.log"/>
<IfAccumulatedFileSize exceeds="6GB"/>

這個代表如果超過6GB會把info類型的最舊日志刪除

            <DefaultRolloverStrategy>
                <max>64</max>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-info*.log"/>
                    <IfLastModified age="30d"/>
                </Delete>
                <Delete basePath="${LOG_PATH}" maxDepth="2">
                    <IfFileName glob="*/app-info*.log"/>
                    <IfAccumulatedFileSize exceeds="6GB"/>
                </Delete>
            </DefaultRolloverStrategy>

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 基于多線程中join()的用法實例講解

    基于多線程中join()的用法實例講解

    下面小編就為大家?guī)硪黄诙嗑€程中join()的用法實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java中Volatile的作用實例解析

    Java中Volatile的作用實例解析

    本篇文章給大家通過實例分享了Java中Volatile的作用,有興趣的朋友可以學習參考下。
    2018-07-07
  • java TreeUtil菜單遞歸工具類

    java TreeUtil菜單遞歸工具類

    這篇文章主要為大家詳細介紹了java TreeUtil菜單遞歸工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • java實現(xiàn)雙色球彩票游戲

    java實現(xiàn)雙色球彩票游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)雙色球彩票游戲,超級簡單的邏輯,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 使用Mybatis如何實現(xiàn)刪除多個數據

    使用Mybatis如何實現(xiàn)刪除多個數據

    這篇文章主要介紹了使用Mybatis如何實現(xiàn)刪除多個數據,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot配置連接兩個或多個數據庫的實現(xiàn)

    SpringBoot配置連接兩個或多個數據庫的實現(xiàn)

    本文主要介紹了SpringBoot配置連接兩個或多個數據庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Spring高級注解之@DependsOn詳解

    Spring高級注解之@DependsOn詳解

    這篇文章主要介紹了Spring高級注解之@DependsOn詳解,@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)冒泡排序

    Java實現(xiàn)冒泡排序

    這篇文章主要為大家詳細介紹了Java實現(xiàn)冒泡排序,把一列數組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot大事務問題的常用優(yōu)化方案

    SpringBoot大事務問題的常用優(yōu)化方案

    大事務是指運行時間比較長,操作的數據比較多的事務123,大事務的產生原因包括操作的數據比較多、大量的鎖競爭、事務中有其他非數據庫的耗時操作等,本文給大家總結了SpringBoot大事務問題的常用優(yōu)化方案,需要的朋友可以參考下
    2024-04-04
  • Json字符串與Object、List、Map的互轉工具類

    Json字符串與Object、List、Map的互轉工具類

    今天小編就為大家分享一篇關于Json字符串與Object、List、Map的互轉工具類,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論

孟州市| 额敏县| 壤塘县| 南部县| 巴林左旗| 随州市| 芒康县| 兰考县| 始兴县| 清丰县| 西和县| 如皋市| 包头市| 松阳县| 达日县| 弥渡县| 庆阳市| 涿州市| 隆安县| 五寨县| 高密市| 英山县| 始兴县| 绥棱县| 吕梁市| 贵定县| 北碚区| 广河县| 镇远县| 基隆市| 无锡市| 孝义市| 延庆县| 景宁| 阳城县| 蒙自县| 竹溪县| SHOW| 长武县| 炎陵县| 承德市|