欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你搞定SpringBoot Log4j2日志配置文件

 更新時間:2025年04月22日 09:43:12   作者:英勇小波  
在項目推進中,如果說第一件事是搭建 Spring 框架的話,那么第二件事情就是在 Sring 基礎(chǔ)上搭建日志框架,本文我們就來學(xué)習(xí)一下SpringBoot如何通過Log4j2配置日志吧

1.在 Spring Boot 應(yīng)用中集成 Log4j2

首先在項目pom文件中引入Log4j的依賴

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

在當(dāng)前項目的resource目錄下增加文件 log4j2.xml

下面介紹配置文件中各個節(jié)點,感興趣的小伙伴也可以去官網(wǎng)查看

2.配置節(jié)點

2.1 根節(jié)點configuration

有兩個屬性:status,monitorinterval,兩個子節(jié)點:Appenders和Loggers表名可以定義多個Appender和Logger

  • status,用來指定log4j本身的打印日志級別  OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
  • monitorinterval 重新讀取配置文件的監(jiān)測間隔時間,單位是s,最小是5s.

2.2 Properties

屬性(可選),用來定義常量(例如日志打印的模版),之后在其他配置項中通過${變量名}引用

2.3 Appenders

常見的有三種子節(jié)點:Console、RollingFile、File

2.3.1 Console

用來定義輸出到控制臺的Appender兩個屬性:name、target,一個節(jié)點:PatternLayout

  • name(屬性):指定Appender的名字
  • target(屬性):SYSTEM_OUT 或 SYSTEM_ERR,一般只設(shè)置默認(rèn):SYSTEM_OUT.
  • PatternLayout(節(jié)點):指定輸出日志的格式,可以使用pattern屬性與Properties中定義的日志打印模板常量相結(jié)合,控制日志輸出的模版,不設(shè)置則默認(rèn)為:%m%n

2.3.2 File

文件輸出源,用于將日志寫入到指定的文件,需要配置輸入到哪個位置(例如:D:/logs/info.log)

  • name(屬性)::指定Appender的名字.
  • fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名.
  • PatternLayout(節(jié)點):輸出格式,不設(shè)置默認(rèn)為:%m%n.

2.3.3 RollingFile

也是寫入到文件,不同的是比File更加強大,可以指定當(dāng)文件達到一定大?。ㄈ?0MB)時,另起一個文件繼續(xù)寫入日志,另起一個文件就涉及到新文件的名字命名規(guī)則,因此需要配置文件命名規(guī)則 

這種方式更加實用,因為你不可能一直往一個文件中寫,如果一直寫,文件過大,打開就會卡死,也不便于查找日志。

name(屬性):指定Appender的名字.

fileName(屬性):指定輸出日志的目的文件帶全路徑的文件名

PatternLayout(節(jié)點):輸出格式,不設(shè)置默認(rèn)為:%m%n

filePattern:指定新建日志文件的名稱格式.

Policies(節(jié)點):指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志.

TimeBasedTriggeringPolicy(節(jié)點):Policies子節(jié)點,基于時間的滾動策略,interval屬性用來指定多久滾動一次,默認(rèn)是1 hour。modulate=true用來調(diào)整時間:比如現(xiàn)在是早上3am,interval是4,那么第一次滾動是在4am,接著是8am,12am..而不是7am.

SizeBasedTriggeringPolicy(節(jié)點):Policies子節(jié)點,基于指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小.

DefaultRolloverStrategy(節(jié)點):用來指定同一個文件夾下最多有幾個日志文件時開始刪除最l舊的,創(chuàng)建新的(通過max屬性);可以指定壓縮級別(通過compressionLevel屬性),compressionLevel的值通常是一個介于0到9之間的整數(shù),其中:0表示無壓縮,1表示最快的壓縮速度(但壓縮率最低),9表示最高的壓縮率(但壓縮速度最慢)

Delete:清理舊日志文件的策略;basePath指定了日志文件所在的基目錄;maxDepth用于指定清理或刪除日志文件時搜索的目錄深度,值是一個整數(shù),表示從basePath開始向下搜索的目錄層級數(shù)

IfFileName:Delete子節(jié)點,用于匹配要刪除的文件名模式。glob接受一個通配符模式,用來匹配文件名。

IfLastModified:Delete子節(jié)點,用于檢查文件的最后修改時間,并基于該時間點決定文件是否應(yīng)該被清理或刪除;age指定了文件最后修改時間與當(dāng)前時間之間最大允許的時間差

如果maxDepth="0",則只會考慮basePath所指向的目錄本身,不包括任何子目錄。

如果maxDepth="1",則會考慮basePath所指向的目錄及其直接子目錄。

如果maxDepth="2",則會考慮basePath所指向的目錄、其直接子目錄以及這些子目錄下的子目錄(即二級子目錄)。

2.4 Logger

Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。level:日志輸出級別,共有8個級別,按照從低到高為: All < Trace < Debug < Info < Warn < Error < Fatal < OFF

root :設(shè)定根日志的日志級別

name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節(jié)點.

AppenderRef:Logger的子節(jié)點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認(rèn)繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出。

additivity:是否繼承root節(jié)點,默認(rèn)是true繼承。默認(rèn)情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender里輸出。若是additivity設(shè)為false,則子Logger只會在自己的appender里輸出,而不會在父Logger的appender里輸出。     

3.日志輸出模板參數(shù)介紹

格式化輸出:
    %date{yyyy-MM-dd HH:mm:ss.SSS}: 簡寫為%d 日期 2023-08-12 15:04:30,123
    %thread: %t 線程名, main
    %-5level:%p 日志級別,從左往右至少顯示5個字符寬度,不足補空格 INFO
    %msg:%m 日志消息 info msg
    %n: 換行符
    {cyan}: 藍綠色(青色)
    %logger{36}: %c 表示 Logger 名字最長36個字符
    %C: 類路徑 com.qq.demolog4j2.TestLog4j2
    %M: 方法名 main
    %F: 類名 TestLog4j2.java
    %L: 行號 12
    %l: 日志位置, 相當(dāng)于 %C.%M(%F.%L)  com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
    %highlight:高亮顯示,%highlight{%-5level}

如果控制臺輸出的日志級別沒有高亮顯示,Log4j2默認(rèn)關(guān)閉了Jansi:一個支持輸出ANSI顏色的類庫 IDEA中,點擊右上角->Edit+Configurations,在VM+options中添加-Dlog4j.skipJansi=false

下面就是我在開發(fā)中使用的一些配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
 
    <properties>
        <!-- 日志打印級別 -->
        <property name="LOG_LEVEL">INFO</property>
        <!-- APP名稱 -->
        <property name="APP_NAME" value="framework_project"/>
        <!-- 日志文件存儲路徑 -->
        <property name="LOG_HOME">/framework_project</property>
        <!-- 存儲天數(shù) -->
        <property name="LOG_MAX_HISTORY" value="60d"/>
        <!-- 單個日志文件最大值, 單位 = KB, MB, GB -->
        <property name="LOG_MAX_FILE_SIZE" value="10 MB"/>
        <!-- 每天每個日志級別產(chǎn)生的文件最大數(shù)量 -->
        <property name="LOG_TOTAL_NUMBER_DAILY" value="10"/>
        <!-- 壓縮文件的類型,支持zip和gz,建議Linux用gz,Windows用zip -->
        <property name="ARCHIVE_FILE_SUFFIX" value="zip"/>
        <!-- 日志文件名 -->
        <property name="LOG_FILE_NAME" value="${LOG_HOME}"/>
        <property name="FILE_NAME_PATTERN" value="${LOG_HOME}/%d{yyyy-MM-dd}"/>
 
 
        <!--日志輸出格式-控制臺彩色打印-->
        <property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright
            RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} |
            %cyan{%c{1.}} : %white{%msg%n}
        </property>
        <!--日志輸出格式-文件-->
        <property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %5pid --- [%15.15t] %c{1.} [%L] : %m%n
        </property>
        <!--日志輸出格式-控制臺彩色打印-->
        <property name="DEFAULT_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} %style{%5pid}{bright,magenta} --- [%17.17t] %cyan{%c{1.} [%L]} : %m%n
        </property>
    </properties>
 
    <Appenders>
        <!-- 控制臺的輸出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--輸出日志的格式-->
            <PatternLayout pattern="${DEFAULT_PATTERN}"/>
        </Console>
 
        <!-- 新增包含所有級別日志的文件 Appender -->
        <RollingFile name="RollingFileAllLevels" fileName="${LOG_FILE_NAME}/all.log"
                     filePattern="${FILE_NAME_PATTERN}/all.log">
            <Filters>
                <!-- 不過濾任何日志級別 -->
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}"/>
            <Policies>
                <!-- 歸檔每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 限制單個文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
            </Policies>
            <!-- 限制每天文件個數(shù) -->
            <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="*.all.*.log"/>
                    <IfLastModified age="${LOG_MAX_HISTORY}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <!-- 打印出所有的info及以下級別的信息,每次大小超過size進行壓縮,作為存檔-->
        <RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}/info.log"
                     filePattern="${FILE_NAME_PATTERN}/info.log">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--輸出日志的格式-->
            <PatternLayout pattern="${ENCODER_PATTERN}"/>
            <Policies>
                <!-- 歸檔每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 限制單個文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
            </Policies>
            <!-- 限制每天文件個數(shù) -->
            <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob=".info.*.log"/>
                    <IfLastModified age="${LOG_MAX_HISTORY}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <RollingFile name="RollingFileDebug"
                     fileName="${LOG_FILE_NAME}/debug.log"
                     filePattern="${FILE_NAME_PATTERN}/debug.log">
            <Filters>
                <ThresholdFilter level="DEBUG"/>
                <ThresholdFilter level="INFO" onMatch="DENY"
                                 onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}"/>
            <Policies>
                <!-- 歸檔每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 限制單個文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
            </Policies>
            <!-- 限制每天文件個數(shù) -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="*.debug.*.log"/>
                    <IfLastModified age="${LOG_MAX_HISTORY}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}/warn.log"
                     filePattern="${FILE_NAME_PATTERN}/warn.log">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY"
                                 onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}"/>
            <Policies>
                <!-- 歸檔每天的文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 限制單個文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
            </Policies>
            <!-- 限制每天文件個數(shù) -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="*.warn.*.log"/>
                    <IfLastModified age="${LOG_MAX_HISTORY}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <RollingFile name="RollingFileError"
                     fileName="${LOG_FILE_NAME}/error.log"
                     filePattern="${FILE_NAME_PATTERN}/error.log">
            <Filters>
                <ThresholdFilter level="ERROR"/>
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="*.error.*.log"/>
                    <IfLastModified age="${LOG_MAX_HISTORY}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
 
    <!--只有定義了logger并引入以上Appenders,Appender才會生效-->
    <Loggers>
        <root level="${LOG_LEVEL}">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileAll"/>
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <!-- 添加新的Appender引用 -->
            <appender-ref ref="RollingFileAllLevels"/>
        </root>
    </Loggers>
</configuration>

4.知識擴展

如何設(shè)置Log4j2的監(jiān)控間隔?

在 Log4j2 中,可以通過在配置文件中設(shè)置 monitorInterval 屬性來指定監(jiān)控配置文件變化的時間間隔。這個屬性告訴 Log4j2 每隔多少秒檢查一次配置文件是否有變化,如果有變化則自動重新加載配置。以下是具體的設(shè)置方法和示例:

1. XML 配置文件示例

在 log4j2.xml 配置文件的根 <Configuration> 元素中添加 monitorInterval 屬性:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

在這個示例中,monitorInterval="30" 表示 Log4j2 每隔 30 秒檢查一次配置文件是否有變化。如果配置文件發(fā)生變化,Log4j2 會自動重新加載配置。

2. JSON 配置文件示例

在 log4j2.json 配置文件中,可以通過在配置對象中添加 "monitorInterval" 屬性來設(shè)置監(jiān)控間隔:

{
  "configuration": {
    "status": "WARN",
    "monitorInterval": 30,
    "appenders": {
      "console": {
        "type": "Console",
        "target": "SYSTEM_OUT",
        "PatternLayout": {
          "pattern": "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
        }
      }
    },
    "loggers": {
      "root": {
        "level": "info",
        "appenderRefs": [
          {
            "ref": "console"
          }
        ]
      }
    }
  }
}

3. YAML 配置文件示例

在 log4j2.yaml 配置文件中,可以通過在 configuration 對象中添加 monitorInterval 屬性來設(shè)置監(jiān)控間隔:

configuration:
  status: WARN
  monitorInterval: 30
  appenders:
    console:
      type: Console
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
  loggers:
    root:
      level: info
      appenderRefs:
        - ref: console

4. 注意事項

監(jiān)控間隔單位:monitorInterval 的單位是秒。

最小間隔:Log4j2 要求 monitorInterval 的值至少為 1 秒。

性能影響:雖然監(jiān)控配置文件變化提供了一定的便利性,但頻繁的文件檢查可能會對性能產(chǎn)生輕微影響。因此,建議根據(jù)實際需求合理設(shè)置監(jiān)控間隔。

文件變化檢測:Log4j2 通過檢測配置文件的最后修改時間(last-modified time)來判斷文件是否發(fā)生變化。如果文件系統(tǒng)或編輯工具沒有正確更新文件的最后修改時間,Log4j2 可能無法檢測到變化。

通過這些方法,你可以輕松設(shè)置 Log4j2 的監(jiān)控間隔,使其在配置文件發(fā)生變化時自動重新加載配置,而無需重啟應(yīng)用程序。

到此這篇關(guān)于一文帶你搞定SpringBoot Log4j2日志配置文件的文章就介紹到這了,更多相關(guān)SpringBoot Log4j2日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java線程同步器CountDownLatch

    詳解Java線程同步器CountDownLatch

    這篇文章主要介紹了Java線程同步器CountDownLatch的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • springboot+swagger2.10.5+mybatis-plus 入門詳解

    springboot+swagger2.10.5+mybatis-plus 入門詳解

    這篇文章主要介紹了springboot+swagger2.10.5+mybatis-plus 入門,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java中Arrays工具類的一些常見方法總結(jié)

    Java中Arrays工具類的一些常見方法總結(jié)

    在Java中Arrays類是一個實用工具類,用于在數(shù)組上執(zhí)行各種操作,包括排序、搜索、比較等,這篇文章主要給大家介紹了關(guān)于Java中Arrays工具類的一些常見方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Java使用IOC控制反轉(zhuǎn)的三種設(shè)計模式詳解

    Java使用IOC控制反轉(zhuǎn)的三種設(shè)計模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java使用IOC控制反轉(zhuǎn)的三種設(shè)計模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個Web安全配置類上,實現(xiàn)了接口,需要的朋友可以參考下
    2023-12-12
  • 詳解mybatis collection標(biāo)簽一對多的使用

    詳解mybatis collection標(biāo)簽一對多的使用

    這篇文章主要介紹了mybatis collection標(biāo)簽一對多的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java 中的類和對象詳情

    Java 中的類和對象詳情

    這篇文章主要介紹了Java 中的類和對象,類可以看成是創(chuàng)建Java對象的模板,下面文章圍繞著Java 類與對象詳細(xì)內(nèi)容展開,需要的朋友可以參考一下
    2021-11-11
  • Java中Lombok常用注解分享

    Java中Lombok常用注解分享

    以前的Java項目中充斥了太多不友好的代碼,這些代碼不僅沒有什么技術(shù)含量,還影響代碼的美觀,所以Lombok應(yīng)運而生了。本文和大家分享了一些Java中Lombok常用注解,需要的可以了解一下
    2023-04-04
  • SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作

    SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作

    這篇文章主要介紹了SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,主要使用Jpa連接數(shù)據(jù)庫對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,需要的朋友可以參考下
    2023-05-05
  • java啟動jar包修改JVM默認(rèn)內(nèi)存問題

    java啟動jar包修改JVM默認(rèn)內(nèi)存問題

    這篇文章主要介紹了java啟動jar包修改JVM默認(rèn)內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論