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

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

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

簡單介紹

日志切割

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

效果如圖:

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

日志分離

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

效果如圖:

日志被根據(jù)不同級別分層保存

日志清理

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

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

如何在SpringBoot項目中配置使用

第一步,導(dǎo)入如下依賴到pom.xml文件當(dāng)中

        <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>

實(shí)現(xiàn)原理

日志切割

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

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

參數(shù) ${FILE_SIZE}被定義為 64MB。

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

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

日志的分離

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

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

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

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

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

日志清理

日志清理有三個策略

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

當(dāng)同一天內(nèi)的第 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>

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    Java中Volatile的作用實(shí)例解析

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

    java TreeUtil菜單遞歸工具類

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

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

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

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

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

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

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

    Spring高級注解之@DependsOn詳解

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

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

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

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

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

    Json字符串與Object、List、Map的互轉(zhuǎn)工具類

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

最新評論

西乡县| 裕民县| 襄城县| 左权县| 西峡县| 麦盖提县| 台前县| 湟源县| 宝坻区| 塔河县| 新乡市| 榆林市| 自治县| 普陀区| 南部县| 合川市| 桐城市| 长沙县| 定陶县| 东乡县| 福建省| 拜泉县| 灵丘县| 伊通| 张掖市| 旬邑县| 龙陵县| 宜昌市| 涡阳县| 牙克石市| 离岛区| 新邵县| 房产| 乡城县| 建德市| 南汇区| 黄梅县| 大连市| 独山县| 白城市| 民勤县|