Log4j2配置


Log4j 2

配置

可以自動加載配置,配置文件包括四種格式:properties,yml,json,xml,配置文件優先級依次為 log4j2.configurationFile > log4j2-test.properties > log4j2-test.yaml或log4j2-test.yml > log4j2-test.json或log4j2-test.jsn > log4j2-test.xml > log4j2.properties > log4j2.yaml或log4j2.yml > log4j2.json或log4j2.jsn > log4j2.xml > DefaultConfiguration,配置文件需要放在classpath路徑下

配置文件示例

在實際項目中用過properties和xml格式,yml和json沒用過

log4j2.properties

# 名稱
name=PropertiesConfig
# 全局日志級別
status=INFO

# 過濾器
# 過濾器類型
filter.threshold.type = ThresholdFilter
# 過濾級別
filter.threshold.level = debug

# console
# 指定輸出源的類型與名稱
appender.console.type=Console
appender.console.name=Console
appender.console.layout.type=PatternLayout
# 輸出模板
appender.console.layout.pattern=%d%p[%c]-%m%n

# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=RollingFile
appender.rolling.fileName=logs/properties.log
# 指定當發生Rolling時,文件的轉移和重命名規則
appender.rolling.filePattern=logs/properties.%d{YYYYMMdd}.log
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%d%p[%c]-%m%n
# 指定記錄文件的封存策略,該策略主要是完成周期性的日志文件封存工作
appender.rolling.policies.type=Policies
# 基於時間的觸發策略
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
# 當前記錄周期為每天生成一個文件
appender.rolling.policies.time.interval=1
# 設置是否按小時來計算封存周期,否則以文件名格式
appender.rolling.policies.time.modulate = false

# 含有包含關系的類包,被子包的需要放在父包前面
loggers=org.hibernate.util.JDBCExceptionReporter,org.hibernate

logger.org.hibernate.util.JDBCExceptionReporter.name=org.hibernate.util.JDBCExceptionReporter
logger.org.hibernate.util.JDBCExceptionReporter.level=OFF
logger.org.hibernate.util.JDBCExceptionReporter.appenderRef.stdout.ref=Console
logger.org.hibernate.util.JDBCExceptionReporter.appenderRef.rolling.ref=RollingFile
logger.org.hibernate.util.JDBCExceptionReporter.additivity=false

logger.org.hibernate.name=org.hibernate
logger.org.hibernate.level=FATAL
logger.org.hibernate.appenderRef.stdout.ref=Console
logger.org.hibernate.appenderRef.rolling.ref=RollingFile
logger.org.hibernate.additivity=false

# rootLogger, 根記錄器,所有記錄器的父輩
# 指定根日志的級別
rootLogger.level=info
# 指定輸出的appender引用
rootLogger.appenderRef.stdout.ref=Console
rootLogger.appenderRef.rolling.ref=RollingFile

log4j2.yml

Configuration:
  status: warn
  name: YAMLConfigTest
  properties:
    property:
      name: filename
      value: target/test-yaml.log
  thresholdFilter:
    level: debug
  appenders:
    Console:
      name: STDOUT
      target: SYSTEM_OUT
      PatternLayout:
        Pattern: "%m%n"
    File:
      name: File
      fileName: ${filename}
      PatternLayout:
        Pattern: "%d %p %C{1.} [%t] %m%n"
      Filters:
        ThresholdFilter:
          level: error
  Loggers:
    logger:
      -
        name: org.apache.logging.log4j.test1
        level: debug
        additivity: false
        ThreadContextMapFilter:
          KeyValuePair:
            key: test
            value: 123
        AppenderRef:
          ref: STDOUT
      -
        name: org.apache.logging.log4j.test2
        level: debug
        additivity: false
        AppenderRef:
          ref: File
    Root:
      level: error
      AppenderRef:
        ref: STDOUT

log4j2.json

{ "configuration": { "status": "debug", "name": "RoutingTest",
                      "packages": "org.apache.logging.log4j.test",
      "properties": {
        "property": { "name": "filename",
                      "value" : "target/rolling1/rollingtest-$${sd:type}.log" }
      },
    "ThresholdFilter": { "level": "debug" },
    "appenders": {
      "appender": [
         { "type": "Console", "name": "STDOUT", "PatternLayout": { "pattern": "%m%n" }, "ThresholdFilter": { "level": "debug" }},
         { "type": "Routing",  "name": "Routing",
          "Routes": { "pattern": "$${sd:type}",
            "Route": [
              {
                "RollingFile": {
                  "name": "Rolling-${sd:type}", "fileName": "${filename}",
                  "filePattern": "target/rolling1/test1-${sd:type}.%i.log.gz",
                  "PatternLayout": {"pattern": "%d %p %c{1.} [%t] %m%n"},
                  "SizeBasedTriggeringPolicy": { "size": "500" }
                }
              },
              { "AppenderRef": "STDOUT", "key": "Audit"}
            ]
          }
        }
      ]
    },
    "loggers": {
      "logger": [
        { "name": "EventLogger", "level": "info", "additivity": "false",
          "AppenderRef": { "ref": "Routing" }},
        { "name": "com.foo.bar", "level": "error", "additivity": "false",
          "AppenderRef": { "ref": "STDOUT" }}
      ],
      "root": { "level": "error", "AppenderRef": { "ref": "STDOUT" }}
    }
  }
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration status="WARN" monitorInterval="30">
  <!--先定義所有的appender-->
  <appenders>
    <!--這個輸出控制台的配置-->
    <console name="Console" target="SYSTEM_OUT">
      <!--輸出日志的格式-->
      <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
    </console>
    <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
    <File name="log" fileName="log/test.log" append="false">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
    </File>
    <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
    <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
      <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
      <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
      </Policies>
    </RollingFile>
    <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
      <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
      <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
      </Policies>
      <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
      <DefaultRolloverStrategy max="20" />
    </RollingFile>
    <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
      <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
      <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
      </Policies>
    </RollingFile>
  </appenders>
  <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效-->
  <loggers>
    <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
    <logger name="org.springframework" level="INFO"></logger>
    <logger name="org.mybatis" level="INFO"></logger>
    <root level="all">
      <appender-ref ref="Console" />
      <appender-ref ref="RollingFileInfo" />
      <appender-ref ref="RollingFileWarn" />
      <appender-ref ref="RollingFileError" />
    </root>
  </loggers>
</configuration>

配置參數

appender組件列表

append 描述
AsyncAppender 用於接受其他類型appender的引用,並使用單獨線程異步寫入log
CassandraAppender 將日志寫入Cassandra數據庫中,需要提前建立keyspace和table
ConsoleAppender 其日志寫入System.out或System.err,默認為System.out
FailoverAppender 故障轉移appender,可以指定主appender,並且包含一組appender集合,當主appender寫入失敗,則會依次使用其他append寫入,直至寫入成功或者全部appender寫入失敗
FileAppender 將日志寫入文件,使用FileManager執行io
FlumeAppender 將日志序列化后發送給Flume代理。 可選組件,由單獨的jar提供。
JDBCAppender 使用標准JDBC將日志寫入關系數據庫表,必須使用連接池
JMS Appender 將日志發送至JMS中
JPAAppender 通過JPA將日志寫入關系型數據庫表,需要有單獨的persistence.xml配置文件
HttpAppender 通過http請求發送日志,使用HttpURLConnection實現,響應2XX狀態碼為成功,否則拋出異常
KafkaAppender 將日志事件發送到Kafka的topic中
MemoryMappedFileAppender 2.1新增功能,將指定日志文件的一部分映射至內存,並將新日志事件寫入此內存,達到閾值時將此內存刷新至存儲設備
NoSQLAppender 使用內部輕量級Provider接口將日志事件寫入NoSQL數據庫。目前只有MongoDB和Apache CouchDB的Provider實現
NoSQLAppender for MongoDB 2.0.11開始,提供兩個MongoDB模塊:log4j-mongodb2、log4j-mongodb3
NoSQLAppender for MongoDB 2 使用MongoDB驅動程序版本2將日志寫入MongoDB中
NoSQLAppender for MongoDB 3 使用MongoDB驅動程序版本3將日志寫入MongoDB中
NoSQLAppender for Apache CouchDB 使用內部輕量級Provider將日志寫入CouchDB中
OutputStreamAppender OutputStreamAppender不能直接配置,只是作為基礎組件提供給其他Appender使用,如可以將日志事件寫入輸出流的File和Socket
RandomAccessFileAppender 與FileAppender相比,使用的I/O實現類不同,FileAppender使用FileOutputStream,RandomAccessFileAppender 使用RandomAccessFile。bufferedIO=true(默認是true)時,性能提高20-200% 。
RewriteAppender 用於在日志被其他Appender寫入文件之前,通過RewritePolicy修改日志事件
RollingFileAppender 將日志寫入文件,並根據TriggeringPolicy和RolloverPolicy規則將文件歸檔、清理
RollingRandomAccessFileAppender 與RollingFileAppender相比,使用的I/O實現類不同,RollingFileAppender使用FileOutputStream,RollingRandomAccessFileAppender使用RandomAccessFile。bufferedIO=true(默認是true)時,性能提高20-200% 。
RoutingAppender 配置不同的規則,將日志路由到不同的Appender進行輸出
SMTPAppender 發生指定日志事件時,發送電子郵件
ScriptAppenderSelector 根據Script腳本的執行結果來選擇AppenderSet中配置的Appender,並將結果輸出至ScriptAppenderSelector的name中
SocketAppender 通過tcp或者udp,將日志寫入遠程目標中
SyslogAppender SyslogAppender是一個SocketAppender,它將其輸出以符合BSD Syslog或RFC 5424格式的日志寫入到遠程目標
ZeroMQ/JeroMQ Appender ZeroMQ Appender使用JeroMQ庫將日志事件發送到一個或多個ZeroMQ端點

ConsoleAppender

ConsoleAppender比較簡單,就是把日志寫入System.out或者System.err中,基本配置如下:

Console一般使用基本配置就可以,唯一要注意的就是輸出格式pattern,pattern的配置釋義如下:

參數 描述
%c或%logger 輸出logName,如 Logger log = LoggerFactory.getLogger(“com.test.logName”); 則輸出為“com.test.logName” ,如果格式為%c{參數},則輸出內容參考官網:image
%C或%class 輸出為所在類的全路徑名
d{pattern}或date 輸出時間,其中pattern可以是保留字,也可以是SimpleDateFormat中的字符。如 %d{DEFAULT} --> 2012-11-02 14:34:02,781 %d{DEFAULT_MICROS} --> 2012-11-02 14:34:02,123456 %d{yyyy-MM-dd HH:mm:ss.SSS} --> 2020-03-31 23:25:13.321 詳見log4j PatternLayout
%F或%file 輸出所在類名.java,如所在類為com.test.LogTest,則輸出為LogTest.java
%l 輸出錯誤的完整位置,全路徑類名.方法名(類名.java:行號),如,com.test.LogTest.testLog(LogTest.java:31)
%L 輸出行號
%m或%msg或%message 輸出log.error(text)中的text內容
%M或%method 輸出方法名
%n 換行符
%t或%thread 輸出線程名
%u{“RANDOM”| “TIME”}或uuid 輸出uuid
%sn或%sequenceNumber 輸出自增序列
%r或%relative 輸出從JVM啟動到當前時刻的毫秒數
%T或%tid或%threadId 輸出線程id
%t或%tn或%thread或%threadName 輸出線程id
%tp或%threadPriority 輸出線程優先級

RollingFileAppender

RollingFileAppender是一個OutputStreamAppender,可以根據TriggeringPolicy和RolloverPolicy將文件切割歸檔,通過RollingFileManager(擴展了OutputStreamManager)來實際執行文件I / O並執行歸檔。參數如下:

參數 類型 描述
append boolean 默認為true。如果為true,記錄將附加到文件末尾。設置為false時,將在寫入新記錄之前清除文件
bufferedIO boolean 默認為true。如果為true,數據先寫入緩沖區,如果緩沖區滿或者immediateFlush 為true時,數據才被寫入磁盤,如果為false直接寫入磁盤。文件鎖定不能與bufferedIO一起使用
bufferSize int 緩沖區大小。bufferedIO為true時,此參數有效,默認為8192 bytes
createOnDemand boolean 默認為false。按需創建文件。僅當日志事件通過所有Filter並且路由到該append時,append才創建文件
filter Filter 確定事件是否應由此Appender處理,通過CompositeFilter(對應標簽為)可以使用多個過濾器
fileName String 要寫入的文件名,如果不存在或者父目錄不存在,則創建對應的文件或目錄
filePattern String 歸檔文件的模式,取決於所使用的RolloverPolicy
immediateFlush boolean 默認為true。如果為true,每次寫操作后都會將數據刷新入磁盤,可能會影響性能。 每次寫入后刷新僅在使用同步appender時才有用。即使設置為false,異步appender也將在一批事件結束后自動刷新,這也可以確保效率更高的將數據寫入磁盤。
layout Layout 格式化日志輸出格式。如果未設置,則默認為’%m%n’
name String append名稱
policy TriggeringPolicy 用於確定歸檔的觸發條件
strategy RolloverStrategy 用於確定歸檔的文件名稱、路徑及歸檔方式
ignoreExceptions boolean 默認為true。設置為true時,如果記錄日志發生異常,此條日志和異常將被忽略。設置為false時,異常將被拋出到調用方。如果此append用在FailoverAppender中,則必須設置為false。
filePermissions String 創建文件時指定文件的rwx權限,前提是文件系統應支持POSIX文件屬性視圖
fileOwner String 文件所有者。出於安全原因,更改文件的所有者可能受到限制,並且不允許操作時會拋出IOException。 如果_POSIX_CHOWN_RESTRICTED對路徑有效,則只有有效用戶ID等於文件用戶ID或具有適當特權的進程才可以更改文件的所有權,前提是文件系統應支持文件所有者屬性視圖
fileGroup String 文件組。,前提是文件系統應支持POSIX文件屬性視圖

TriggeringPolicy

TriggeringPolicy是控制日志文件歸檔的觸發條件。總共有四種類型的TriggeringPolicy,可以組合(CompositeTriggeringPolicy)多種觸發策略來控制歸檔,標簽為,如果配置了多種策略,則只要有一種策略返回true,就返回true。

<Policies> <!-- <CronTriggeringPolicy schedule="0 0 * * * ?"/> --> <OnStartupTriggeringPolicy minSize="2" /> <SizeBasedTriggeringPolicy size="20 MB" /> <TimeBasedTriggeringPolicy /></Policies>

四種類型如下:

  • OnStartupTriggeringPolicy
    如果日志文件的時間比JVM的啟動時間早,或者達到minSize的值,則會觸發歸檔。
    minSize:觸發文件歸檔的最小值,默認為1。
  • SizeBasedTriggeringPolicy
    當文件達到指定大小后,觸發歸檔。大小可以通過size指定,單位為KB、MB、GB。與TimeBasedTriggeringPolicy配合使用時,filePattern中必須包含%i,否則文件每次歸檔時都會覆蓋當前文件,因為TimeBasedTriggeringPolicy不會讓文件名中的時間戳改變。如果不使用TimeBasedTriggeringPolicy,則SizeBasedTriggeringPolicy會讓時間戳改變。
  • TimeBasedTriggeringPolicy
    當前時間與當前日志文件時間不匹配時,TimeBasedTriggeringPolicy會觸發歸檔。參數如下:
參數 描述
interval 基於filePattern中配置的最小時間單位進行來控制歸檔頻率,默認值為1。如:filePattern中最小時間單位為小時,如果interval=1,則1小時歸檔一次;如果interval=2,則2小時歸檔一次。
modulate 默認為false。指明是否對interval進行調節,若modulate為true,會以0為開始對interval進行偏移計算。例如,最小時間粒度為小時,當前為3:00,interval為4,則后面歸檔時間依次為4:00,8:00,12:00,16:00
maxRandomDelay 指示隨機延遲過渡的最大秒數。默認情況下,該值為0,表示沒有延遲。此設置在配置了多個應用程序以同時滾動日志文件的服務器上很有用,並且可以在整個時間上分散這樣做的負擔。
  • CronTriggeringPolicy
    基於cron表達式觸發歸檔。此策略由計時器控制,並且與處理日志事件異步,因此上一個或下一個時間段的日志事件可能會出現在當前日志文件的開頭或結尾。filePattern屬性應包含一個時間戳,否則目標文件將在每次歸檔時被覆蓋。參數如下:
參數 描述
schedule cron表達式,該表達式與Quartz調度程序中允許的表達式相同。詳見CronExpression
EvaluationOnStartup 啟動時,將根據文件的最后修改時間戳評估cron表達式。如果cron表達式指示應該在該時間和當前時間之間歸檔,則文件將立即被歸檔。

RolloverPolicy

用來控制文件歸檔方式,目前有兩種類型:DefaultRolloverStrategy和DirectWriteRolloverStrategy

DefaultRolloverStrategy

通過接收filePattern屬性中日期/時間模式(%d)和整數(%i)來控制歸檔方式。如果存在日期/時間模式,則將在歸檔時使用當前時間替換filePattern中配置的日期/時間部分,如果模式包含整數,則它將在每次歸檔時遞增。如果歸檔時在模式中同時包含日期/時間和整數,則整數將遞增,直到日期/時間部分也將被替換。如果文件模式以“ .gz”,“.zip”,“.bz2”,“.deflate”,“.pack200”或“ .xz”結尾,則將使用與后綴匹配的壓縮方案來壓縮文件。 bzip2, Deflate, Pack200 and XZ格式要求有Apache Commons Compress組件,另外xz格式還要求有XZ for Java組件。

DefaultRolloverStrategy參數如下:

參數 描述
fileIndex 默認值為max。可選值為:min、max,2.8之后新增nomax。文件歸檔及新文件創建規則后面介紹。
min 計數器的最小值。預設值為1。
max 計數器的最大值。一旦達到此值,較舊的歸檔文件將在以后的轉換中被刪除。預設值為7。
compressionLevel 將壓縮級別設置為0-9,其中0 =無,1 =最佳速度,直到9 =最佳壓縮。僅針對ZIP文件實現
tempCompressedFilePattern 壓縮期間歸檔日志文件的文件名的模式。

fileIndex設值不同,則文件歸檔及新文件創建及計數器遞增方法都不同,計數器遞增有三種方式,如下:

  • 方式一:fileIndex值為max
    假設將DefaultRolloverStrategy的min屬性設置為1,將max屬性設置為3,fileName是“ foo.log”,filePattern是“ foo-%i.log”,歸檔規則如下:
歸檔數 當前日志文件 歸檔文件 描述
0 foo.log - 所有日志記錄都將轉到初始文件
1 foo.log foo-1.log 第一次歸檔,foo.log重命名為foo-1.log。創建新的foo.log文件並繼續寫入
2 foo.log foo-2.log,foo-1.log 第二次歸檔,foo.log重命名為foo-2.log。創建新的foo.log文件並繼續寫入
3 foo.log foo-3.log,foo-2.log,foo-1.log 第三次歸檔,foo.log重命名為foo-3.log。創建新的foo.log文件並繼續寫入
4 foo.log foo-3.log,foo-2.log,foo-1.log 第四次和隨后的歸檔,foo-1.log被刪除,foo-2.log被重命名為foo-1.log,foo-3.log被重命名為foo-2.log,foo.log被重命名為foo-3.log。創建新的foo.log文件並繼續寫入。
  • 方式二:fileIndex值為min

假設將DefaultRolloverStrategy的min屬性設置為1,將max屬性設置為3,fileName是“ foo.log”,filePattern是“ foo-%i.log”,歸檔規則如下:

歸檔數 當前日志文件 歸檔文件 描述
0 foo.log - 所有日志記錄都將轉到初始文件
1 foo.log foo-1.log 第一次歸檔,foo.log重命名為foo-1.log。創建新的foo.log文件並繼續寫入
2 foo.log foo-1.log,foo-2.log 第二次歸檔,將foo-1.log重命名為foo-2.log,並將foo.log重命名為foo-1.log。創建新的foo.log文件並繼續寫入
3 foo.log foo-1.log,foo-2.log,foo-3.log 第三次歸檔,將foo-2.log重命名為foo-3.log,將foo-1.log重命名為foo-2.log,將foo.log重命名為foo-1.log。創建新的foo.log文件並繼續寫入
4 foo.log foo-1.log,foo-2.log,foo-3.log 第四次和隨后的歸檔,刪除foo-3.log,將foo-2.log重命名為foo-3.log,將foo-1.log重命名為foo-2.log,將foo.log重命名為foo -1.log。創建新的foo.log文件並繼續寫入。
  • 方式三:fileIndex值為nomax
    nomax為2.8新增屬性,設置為nomax時,將忽略DefaultRolloverStrategy的最大值和最小值,每次歸檔生成的新文件相對於前一個文件編號加1,沒有最大文件數限制。
DirectWriteRolloverStrategy

將日志事件直接寫入由filePattern表示的文件。使用此策略文件不會執行重命名。如果是基於大小的觸發策略,將在指定的時間段內寫入多個文件,它們從1開始編號,並不斷遞增直到發生基於時間歸檔。

注意:如果filePattern的后綴表示應該進行壓縮,則在關閉應用程序時不會壓縮當前文件。此外,如果時間更改使得filePattern不再與當前文件匹配,則啟動時也不會對其進行壓縮。

DirectWriteRolloverStrategy模式參數如下:

參數 描述
maxFiles 與文件格式匹配的時間段內允許的最大文件數。如果超出文件數量,則最早的文件將被刪除。如果指定,則該值必須大於1。如果該值小於零或省略,則文件數量將不受限制。
compressionLevel 將壓縮級別設置為0-9,其中0 =無,1 =最佳速度,直到9 =最佳壓縮。僅針對ZIP文件實現。
tempCompressedFilePattern 壓縮期間歸檔日志文件的文件名的模式。
歸檔保留策略

DefaultRolloverStrategy模式下,Log4j-2.5引入了Delete(刪除)操作(標簽為),與 max屬性所提供的功能相比,Log4j-2.5使用戶可以更好地控制在歸檔時刪除哪些文件。刪除操作使用戶可以配置一個或多個條件,以選擇要相對於基本目錄刪除的文件。

注意:可以刪除任何文件,而不僅僅是刪除日志文件,因此請謹慎使用此操作!使用testMode參數,可以測試配置,而不會意外刪除錯誤的文件。

delete參數如下:

參數 描述
basePath 必需。從此處開始掃描要刪除的文件的基本路徑。
maxDepth 要訪問的目錄的最大級別數。值為0表示僅訪問起始文件,除非安全管理器拒絕。Integer.MAX_VALUE的值指示應訪問所有級別。默認值為1,表示僅指定基本路徑中的文件。
followLinks 是否遵循符號鏈接。默認為false。
testMode 如果為true,則不會刪除文件,而是在INFO級別打印一條消息到狀態記錄器。使用此功能可以測試配置是否按預期工作。默認為false。
pathSorter 一個實現PathSorter 接口的插件, 用於在選擇要刪除的文件之前對文件進行排序。默認設置是首先對最近修改的文件進行排序。
pathConditions 如果未指定ScriptCondition,則為必需。可以指定一個或多個PathCondition元素。如果指定了多個PathCondition元素,則需要所有的PathCondition結果都為true才會進行刪除。PathCondition也可以嵌套。如果進行嵌套,則是先判斷外層的PathCondition,然后進行內層的判斷。如果沒有嵌套,則是按順序進行判斷。也可以創建自定義條件或使用內置條件:IfFileName 如果文件名與此參數匹配則結果為true,此參數為正則表達式或 glob的文件。IfLastModified 最后修改時間早於或等於此參數則結果為true,此參數為duration。IfAccumulatedFileCount 文件數超過指定個數則結果為true,此參數為整型。IfAccumulatedFileSize 所有文件總大小達到此參數則結果為true,此參數為KB、MB、GB。IfAll 如果此標簽下的所有條件都配置成功(邏輯與),則結果為true。IfAny 如果此標簽下的任何一個條件匹配成功(邏輯或),則結果為true。IfNot 如果此標簽下的所有條件都不匹配(邏輯非),則結果為true。
scriptCondition 如果未指定PathConditions,則為必需。指定腳本的ScriptCondition元素。ScriptCondition應該包含一個Script,ScriptRef或ScriptFile元素,該元素指定要執行的邏輯。(有關配置ScriptFiles和ScriptRefs的更多示例,另請參閱ScriptFilter文檔。)該腳本傳遞了許多參數,包括在basePath下找到的路徑列表(最大maxDepth),並且必須返回包含要刪除的路徑的列表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM