log4j2常用子節點淺析

首先聲明本文並不教您怎麼用log4j2,僅僅只對<Appenders>中常用的子節點進行簡單說明。

要看懂本文需要對log4j2有一定的瞭解,至少能夠知道<Appenders>、<Layouts>和<Loggers>的區別。

本文主要參考對象爲log4j2官方手冊:《Apache Log4j 2 v. 2.1 User's Guide》,但是鑑於官方手冊的不少細節描述得並不是非常清楚,甚至還有錯誤,所以還希望大家自己多試驗,畢竟如果官方文檔有錯誤或寫得不清楚,我也沒辦法。

---------------------------------------------這是一條分割線,以下是正文---------------------------------------------------

Appender控制log4j2的輸出,有非常多的節點可選,包括:<Async>、<Console>、<Failover>、<File>、<Flume>、<JDBC>、<JMS>、<JPA>、<MemoryMappedFile>、<NoSQL>、<RandomAccessFile>、<Rewrite>、<RollingFile>、<RollingRandomAccessFile>、<Routing>、<SMTP>、<Socket>、<Syslog>,本文只簡單介紹最常見的Console、File、RollingFile,提及一下JDBC,其他的都不涉及。

1. <Console>節點

ConsoleAppender將輸出結果寫到System.err或System.out。默認是System.err。必須要包含用來格式化LogEvent的Layout元素。下面是該節點的屬性。注意,是屬性,不是子節點。

參數名

類型

描述

filter

Filter

判斷當前日誌事件是否由這個appender來處理。當使用CompositeFilter時,可以使用多個filter

layout

Layout

格式化LogEvent的Layout。如果沒指定,則按照%m%n輸出。

name

String

Appender的name。用於Logger節點引用。

ignoreException

Boolean

ture:內部記錄並忽略發生的異常。false:拋出給調用者。默認爲ture。如果要將當前appender封裝成FailoverAppender,必須要設置爲false

targer

String

SYSTEM_OUT或SYSTEM_ERR。默認是SYSTEM_OUT(文檔說默認是SYSTEM_ERR,但經我測試默認應該是SYSTEM_OUT)。對於Eclipse來說SYSTEM_OUT是作爲普通信息輸出,是黑色字體;SYSTEM_ERR作爲錯誤日誌輸出,是紅色字體。

2. <File>節點

File即將結果輸出到一個指定文件中。下面是該節點的屬性。注意,是屬性,不是子節點。

參數名

類型

描述

append boolean 是否追加,默認爲ture。ture是將新日誌追加到原日誌文件尾部,false則是刪除已有文件,重建新文件。

bufferIO

boolean

默認爲true:將數據寫入到緩存,緩存滿了才寫入到磁盤

bufferSize

int

默認爲8192bytes

filter

Filter

判斷當前事件是否該這個appender來處理。當使用CompositeFilter時,可以使用多個filter

filename

String

寫入的文件名。不存在的文件名和路徑名都會自動創建

immediateFlush

boolean

 不經過緩存,直接將日誌寫入磁盤,對性能影響較大。

layout

Layout

格式化LogEvent的Layout。

locking

boolean

鎖文件,是否允許併發寫入。默認爲false,即幾個事件可以一起寫。true對性能影響很大。

name

String

Appender的name。

ignoreExceptions

boolean

ture:內部記錄並忽略發生的異常。false:拋出給調用者。默認爲ture。如果要將當前appender封裝成FailoverAppender,必須要設置爲false

3. <RollingFile>節點

RollingFile和File一樣,都是將日誌寫入到文件中,但File對文件的約束很簡單,而RollingFile則較爲靈活,比如多大文件時分拆,最多可以分拆成幾個文件等等。另外,RollingFile需要觸發條件。

觸發條件包括:

<Policies>
    <OnStartupTriggeringPolicy />
    <SizeBasedTriggeringPolicy size="20MB" />
   <TimeBasedTriggeringPolicy />
</Policies>

OnStartupTriggeringPolicy沒有參數,每次JVM重新運行都會觸發。

SizeBasedTriggeringPolicy則是由文件大小觸發,單位可以是KB/MB/GB。

TimeBasedTriggeringPolicy則是根據日期、時間來觸發,例如每隔幾個小時重寫一次文件。不過文檔關於這個節點的描述非常簡陋,我這也沒什麼好寫的。

另外還有<DefaultRolloverStrategy>控制保存文件的規則,比如最多保存多少個文件,舊文件的保存規則,文件壓縮級別。這個參數理解得有些問題,因此有需要用到的看官請自行翻閱官方手冊。

4. <JDBC>節點

使用標準JDBC將日誌寫到庫裏。既可以用JNDI,也可以用自定義的工廠方法。請一定使用連接池,否則對性能的拖累會讓人崩潰。

Parameter Name

Type

Description

name

String

必須的。Appender的name。

ignoreExceptions

boolean

ture:內部記錄並忽略發生的異常。false:拋出給調用者。默認爲ture。如果要將當前appender封裝成FailoverAppender,必須要設置爲false

filter

Filter

判斷當前事件是否該這個appender來處理。當使用CompositeFilter時,可以使用多個filter

bufferSize

int

官方文檔無有用信息,猜測大小默認爲0,單位爲byte。

connectionSource

ConnectionSource

必須的。包含<DataSource>或<ConnectionFactory>節點。

tableName

String

必須的。

columnConfigs

ColumnConfig[]

 必須的。這個參數官方文檔沒有提供任何有意義的內容,且官方的例子中也並沒有包含這個參數,因此並不是必須的。所以我猜測官方文檔寫錯了,其實不應該有此參數。

<DataSource>節點:

Parameter Name

Type

Description

jndiName

String

必須的。使用完整的JNDI前綴,如java:/comp/env/jdbc/LoggingDatabase。請一定指向一個連接池,否則速度會非常慢。

<ConnectionFactory>節點

Parameter Name

Type

Description

class

Class

必須的。一個有能獲得JDBC連接的靜態工廠方法的完整類名。

method

Method

必須的。獲得JDBC連接的靜態工廠方法名。該方法必須無參,且返回類型只能是java.sql.Connection或DataSource。無論如何都請從連接池取連接,否則會非常慢。

<Column>節點使用PreparedStatement將數據插入數據庫的指定列,以防止SQL注入。該節點如下:

Parameter Name

Type

Description

name

String

必須的。插入列的列名

pattern

String

按照PatternLayout規定的格式獲取並插入數據。pattern、literal、isEventTimestamp=”true”必須指定一個且只能指定一個。

literal

String

插入文字,引號包含,可用於引用Oracle的自增字段。pattern、literal、isEventTimestamp=”true”必須指定一個且只能指定一個。

isEventTimestamp

boolean

插入java.sql.Types.TIMESTAMP類型的時間戳。pattern、literal、isEventTimestamp=”true”必須指定一個且只能指定一個。

isUnicode

boolean

如果沒有patter,該屬性將被忽略。默認爲ture,作爲unicode插入,否則爲non-unicode。

isClob

boolean

如果沒有pattern,該屬性將被忽略。true則作爲CLOB插入,否則作爲varchar或nvarchar插入




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章