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

Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南

 更新時(shí)間:2026年04月23日 15:28:54   作者:??? 枕星河  
本文介紹了在SpringBoot項(xiàng)目中配置Log4j2的方法,包括選擇Log4j2的原因、Maven依賴配置、application.yml配置、log4j2.xml完整配置詳解,以及性能優(yōu)化建議,通過合理配置,可以構(gòu)建高性能的異步日志記錄系統(tǒng),滿足日常開發(fā)和運(yùn)維需求

在現(xiàn)代企業(yè)級(jí)應(yīng)用開發(fā)中,日志管理是系統(tǒng)運(yùn)維和問題排查的重要組成部分。本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中配置 Log4j2,包括完整的 [log4j2.xml]配置文件和相關(guān)依賴設(shè)置。

一、為什么選擇 Log4j2?

Spring Boot 默認(rèn)使用 Logback 作為日志框架,但在某些場(chǎng)景下我們更傾向于使用 Log4j2:

  1. 性能優(yōu)勢(shì):Log4j2 使用異步日志記錄,在高并發(fā)環(huán)境下性能表現(xiàn)更優(yōu)
  2. 無鎖設(shè)計(jì):采用 LMAX Disruptor 庫(kù)實(shí)現(xiàn)無鎖異步日志記錄
  3. 靈活配置:支持更豐富的日志過濾和格式化選項(xiàng)
  4. 動(dòng)態(tài)更新:配置文件修改后無需重啟應(yīng)用即可生效

二、Maven 依賴配置

1. 排除默認(rèn)日志框架

首先需要排除 Spring Boot 默認(rèn)的 Logback 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</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</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 添加 Log4j2 依賴

然后添加 Log4j2 相關(guān)依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 高性能異步日志庫(kù) -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.4</version>
</dependency>

三、application.yml 配置

在 [application-pre.yml] 文件中指定日志配置文件:

logging:
  config: classpath:log4j2.xml

這樣配置可以讓 Spring Boot 加載自定義的 Log4j2 配置文件。

3、log4j2.xml 完整配置詳解

1. Properties 屬性定義

<Properties>
    <property name="LOG_HOME" value="/home/test/doc/log"/>
    <property name="APP_CODE" value="file_log"/>
    <property name="LOG_LEVEL_PATTERN" value="%-5p"/>
    <property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
    <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
    <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
    <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID}  | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
    <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
    <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
</Properties>

這里定義了日志系統(tǒng)的各種屬性,包括日志存儲(chǔ)路徑、日志級(jí)別格式、實(shí)例信息格式等。

2. Appenders 輸出配置

控制臺(tái)輸出配置

<Console name="Console" target="SYSTEM_OUT" follow="true">
    <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
</Console>

文件滾動(dòng)策略配置

Log4j2 支持多種滾動(dòng)策略,以下是一些常用配置:

事件日志配置

<RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
    <PatternLayout>
        <Pattern>${LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/event.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

應(yīng)用日志配置

<RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
    <PatternLayout>
        <Pattern>${APP_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/app.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

告警日志配置

<RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
    <thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout>
        <Pattern>${ALERT_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/alert.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

錯(cuò)誤日志配置

<RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
             filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
    <thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout>
        <Pattern>${APP_LOG_PATTERN}</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="50MB"/>
    </Policies>
    <DefaultRolloverStrategy>
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*/error.log.*" />
            <IfLastModified age="30d" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

3. Loggers 日志記錄器配置

Root Logger 配置

<Root level="INFO">
    <AppenderRef ref="Console" />
    <AppenderRef ref="AppLogFile" />
    <AppenderRef ref="AlertLogFile" />
    <AppenderRef ref="ErrorLogFile" />
</Root>

異步日志記錄器配置

<AsyncLogger name="event" level="ALL" additivity="false">
    <AppenderRef ref="EventLogFile" />
</AsyncLogger>

特定包的日志級(jí)別配置

<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>

3. Loggers 日志記錄器配置

1. 異步日志配置

為了獲得更好的性能,可以使用異步日志記錄:

  • 在根節(jié)點(diǎn)添加 packages="com.lmax.disruptor" 屬性
  • 使用 <AsyncLogger><AsyncRoot> 進(jìn)行異步日志記錄

2. 日志追蹤ID配置

配置中的 %X{TRACE_ID} 允許在日志中加入分布式追蹤ID,方便問題定位。

3. 文件清理策略

配置中的 <Delete> 元素定義了日志文件的自動(dòng)清理策略,保留最近30天的日志文件。

4. 性能優(yōu)化建議

  1. 合理設(shè)置日志級(jí)別,避免輸出過多調(diào)試信息
  2. 使用異步日志記錄提高性能
  3. 合理設(shè)置日志文件大小和保留策略
  4. 定期監(jiān)控日志磁盤使用情況

4、log4j2.xml 完整配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="600">
    <Properties>
        <!--<property name="LOG_HOME" value="${sys:user.home}/home/logs"/>-->
        <!--<property name="LOG_HOME" value="D:\doc\log"/>-->
        <property name="LOG_HOME" value="./logs"/>
        <property name="APP_CODE" value="file_log"/>
        <property name="LOG_LEVEL_PATTERN" value="%-5p"/>
        <property name="INSTANCE_INFO_PATTERN" value="${hostName} | ${sys:user.name}"/>
        <property name="CODE_INFO_PATTERN" value="%pid:%F:%L"/>
        <property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
        <property name="APP_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %X{TRACE_ID}  | %t | ${CODE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
        <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} | %X{TRACE_ID} | ${LOG_LEVEL_PATTERN} | ${INSTANCE_INFO_PATTERN} | FEIA | FLEP-INAPP | %t | ${CODE_INFO_PATTERN} | %m%n"/>
        <property name="ALERT_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN}} $${ctx:traceId:-} | ${INSTANCE_INFO_PATTERN} | [%X{seq}] - %m%n"/>
    </Properties>
    <Appenders>
        <!--控制臺(tái)輸出的相關(guān)配置-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN}} | ${LOG_LEVEL_PATTERN} | %t | %c:%L | [%X{seq}] - %m%n" />
        </Console>
        <!--打印所有的info及以下的級(jí)別的信息,每次超過size,則這size大小的日志會(huì)自動(dòng)存入年份-月份創(chuàng)建的文件夾下進(jìn)行壓縮存檔-->
        <RollingFile name="EventLogFile" fileName="${LOG_HOME}/event.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/event.log.%i">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/event.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="AppLogFile" fileName="${LOG_HOME}/app.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/app.log.%i">
            <PatternLayout>
                <Pattern>${APP_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <!--保留最近30天的日志-->
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/app.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="AlertLogFile" fileName="${LOG_HOME}/alert.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/alert.log.%i">
            <thresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${ALERT_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/alert.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingFile name="ErrorLogFile" fileName="${LOG_HOME}/error.log" immediateFlush="true"
                     filePattern="${LOG_HOME}/%d{yyyyMMdd}/error.log.%i">
            <thresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${APP_LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth = "2">
                    <IfFileName glob = "*/error.log.*" />
                    <IfLastModified age = "30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
            <AppenderRef ref="AppLogFile" />
            <AppenderRef ref="AlertLogFile" />
            <AppenderRef ref="ErrorLogFile" />
        </Root>
        <AsyncLogger name="event" level="ALL" additivity="false">
            <AppenderRef ref="EventLogFile" />
        </AsyncLogger>
        <logger name="com.apache.ibatis" level="TRACE"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
        <logger name="com.cisdi.colmet.core.mapper" level="DEBUG"/>
    </Loggers>
</Configuration>

五、總結(jié)

通過以上配置,我們可以構(gòu)建一個(gè)功能完善、性能優(yōu)異的 Log4j2 日志系統(tǒng)。這種配置不僅滿足了日常開發(fā)和運(yùn)維需求,還提供了高性能的異步日志記錄能力。在實(shí)際項(xiàng)目中,可以根據(jù)具體需求調(diào)整日志級(jí)別、輸出格式和文件策略,以達(dá)到最佳的監(jiān)控和維護(hù)效果。

記住,良好的日志配置是系統(tǒng)穩(wěn)定運(yùn)行和快速排錯(cuò)的重要保障,合理的日志管理策略能夠顯著提升系統(tǒng)的可維護(hù)性和可觀測(cè)性。

到此這篇關(guān)于Spring Boot 日志配置詳解:log4j2.xml 的完整配置指南的文章就介紹到這了,更多相關(guān)Spring Boot log4j2.xml 日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java三個(gè)類加載器及它們的相互關(guān)系

    Java三個(gè)類加載器及它們的相互關(guān)系

    Java在需要使用類別的時(shí)候,才會(huì)將類別加載,Java的類別載入是由類別載入器(Class loader)來達(dá)到的,預(yù)設(shè)上,在程序啟動(dòng)之后,主要會(huì)有三個(gè)類別加載器,文中詳細(xì)介紹了這三個(gè)類加載器,需要的朋友可以參考下
    2021-06-06
  • SpringAOP中的通知Advice解析

    SpringAOP中的通知Advice解析

    這篇文章主要介紹了SpringAOP中的通知Advice解析,AOP 中的通知是基于連接點(diǎn)業(yè)務(wù)邏輯的一種增強(qiáng),Spring AOP 可以基于 XML 方式和基于注解方式定義,只是寫法不同,這里只使用注解的方式來講解通知的詳細(xì)用法,需要的朋友可以參考下
    2023-09-09
  • 淺談Java中的hashcode方法(推薦)

    淺談Java中的hashcode方法(推薦)

    本篇文章主要介紹了Java中的hashcode方法,詳細(xì)的介紹了hashCode方法的作用,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • SpringBoot使用JDBC獲取相關(guān)的數(shù)據(jù)方法

    SpringBoot使用JDBC獲取相關(guān)的數(shù)據(jù)方法

    這篇文章主要介紹了SpringBoot使用JDBC獲取相關(guān)的數(shù)據(jù)方法,JDBC與數(shù)據(jù)庫(kù)建立連接、發(fā)送 操作數(shù)據(jù)庫(kù)的語(yǔ)句并處理結(jié)果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java實(shí)時(shí)日志輸出至前臺(tái)的實(shí)現(xiàn)步驟

    Java實(shí)時(shí)日志輸出至前臺(tái)的實(shí)現(xiàn)步驟

    在Java應(yīng)用程序中實(shí)現(xiàn)將實(shí)時(shí)日志輸出至前臺(tái)(如Web頁(yè)面或桌面應(yīng)用程序),通常涉及到幾個(gè)關(guān)鍵組件和技術(shù)的選擇,下面將詳細(xì)介紹如何使用Java實(shí)現(xiàn)實(shí)時(shí)日志輸出至前臺(tái),并結(jié)合具體的實(shí)現(xiàn)技術(shù)和框架來說明,需要的朋友可以參考下
    2025-10-10
  • 基于Spring-AOP實(shí)現(xiàn)自定義分片工具詳解

    基于Spring-AOP實(shí)現(xiàn)自定義分片工具詳解

    隨著數(shù)據(jù)量的增長(zhǎng),在與其他系統(tǒng)交互時(shí),批量接口會(huì)出現(xiàn)超時(shí)現(xiàn)象,發(fā)現(xiàn)原批量接口在實(shí)現(xiàn)時(shí),沒有做分片處理。由于與其他系統(tǒng)交互比較多,一個(gè)一個(gè)接口去做分片優(yōu)化,改動(dòng)量較大,所以考慮通過AOP解決此問題,感興趣的可以了解一下
    2022-11-11
  • java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例

    java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例

    用Java創(chuàng)建文件或目錄非常簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 關(guān)于Java雙大括號(hào){{}}的具體使用

    關(guān)于Java雙大括號(hào){{}}的具體使用

    本文主要介紹了關(guān)于Java雙大括號(hào){{}}的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • REST架構(gòu)及RESTful應(yīng)用程序簡(jiǎn)介

    REST架構(gòu)及RESTful應(yīng)用程序簡(jiǎn)介

    這篇文章主要為大家介紹了REST架構(gòu)及RESTful的應(yīng)用程序簡(jiǎn)介,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法

    java.sql.SQLRecoverableException關(guān)閉的連接異常問題及解決辦法

    當(dāng)數(shù)據(jù)庫(kù)連接池中的連接被創(chuàng)建而長(zhǎng)時(shí)間不使用的情況下,該連接會(huì)自動(dòng)回收并失效,就導(dǎo)致客戶端程序報(bào)“ java.sql.SQLException: Io 異常: Connection reset” 或“java.sql.SQLException 關(guān)閉的連接”異常問題,下面給大家分享解決方案,一起看看吧
    2024-03-03

最新評(píng)論

嘉义县| 庆阳市| 寿光市| 洪湖市| 江都市| 建德市| 洪湖市| 建德市| 招远市| 长乐市| 阿勒泰市| 玛纳斯县| 天祝| 凤冈县| 洪湖市| 伊吾县| 进贤县| 嘉黎县| 福州市| 周口市| 云南省| 华安县| 平远县| 白水县| 刚察县| 体育| 文化| 明水县| 长兴县| 聊城市| 崇义县| 佛教| 大理市| 永平县| 寿光市| 三门县| 武安市| 阳山县| 德庆县| 新民市| 丰都县|