前言
Appender按網絡釋義,有“輸出目的地”之意。官網給出的定義是:“Appenders are responsible for delivering LogEvents to their destination.”。Log4j2為使用者提供了13種非常實用的Appenders,使用者可用方便的調用這13種Appender來控制日志的輸出。
摘要
Log4j2的Appenders充分考慮了日志事件的輸出、包裝以及過濾轉發的可能,包括最基本的輸出到本地文件、輸出到遠程主機,對文件進行封裝、注入,並且還能按照日志文件的時間點、文件大小等條件進行自動封存。例如,想要將幾個不同源的日志匯集到一起,可以用FlumeAppender;想要在LogEvent中注入信息,可以用RewriteAppender;想要讓系統按照設定的時間間隔自動封存日志信息,可以用RollingFileAppender(每隔一定時間自動保存一份新增的日志文件,並按照時間戳等指定格式命名);當產生安全級別達ERROR或FATAL的LogEvent時,給維護人員發送郵件可用SMTPAppender;希望將日志信息寫到遠程主機的,可用SocketAppender;希望能夠按照RFC5424格式向遠程主機發送日志信息,可用SyslogAppender。等等。
下面將按照如下順序依次介紹每個Appender的作用及重要參數,並附上完整參數地址及官網配置示例地址。
目錄
1、FileAppender 普通地輸出到本地文件
2、FlumeAppender 將幾個不同源的日志匯集、集中到一處。
3、JMSQueueAppender VS. JMSTopicAppender 與JMS相關的日志輸出
4、RewriteAppender 對日志事件進行掩碼或注入信息
5、RollingFileAppender 對日志文件進行封存(詳細)
6、RoutingAppender 在輸出地之間進行篩選路由
7、SMTPAppender 將LogEvent發送到指定郵件列表
8、SocketAppender 將LogEvent以普通格式發送到遠程主機
9、SyslogAppender 將LogEvent以RFC 5424格式發送到遠程主機
10、AsynchAppender 將一個LogEvent異步地寫入多個不同輸出地
11、ConsoleAppender 將LogEvent輸出到命令行
12、FailoverAppender 維護一個隊列,系統將嘗試向隊列中的Appender依次輸出LogEvent,直到有一個成功為止
正文:
1、FileAppender
FileAppender用於將LogEvent寫入到一個文件中,該文件由fileName參數指定。有幾個重要的參數:
① fileName,String,指定寫入的log文件的名稱。
② append,boolean,指定是否是追加寫入(append=true,默認情況),還是覆蓋寫入(append=false)。
③ bufferedIO,boolean,是否對數據進行緩沖到緩沖區滿后再寫入。測試顯示,即使在啟用immediateFlush的情況下,設置bufferedIO=true也能提高性能。
④ locking,boolean,是否對文件上鎖,當有多個線程可能同時寫該文件時需要考慮上鎖(在《異常處理反模式》中就提到要把在一起的日志輸出語句寫到一句,而不是拆成幾句來避免並發線程導致的日志語句之間的錯位)。但對文件上鎖會影響系統的性能,所以需要謹慎使用。默認值是false。
2、FlumeAppender
FlumeAppender是一個可選的組件,它並不包含在core jar中,若要使用,需要額外加入log4j-flume-ng-2.0-beta4.jar包。FlumeAppender是配合Apache Flume來使用的。Apache Flume是一個能有效地將不同地方的大量日志數據收集、聚會到一起的一個系統。詳細信息參見【Apache Flume】
幾個比較重要的參數:
① agents,Agent[],用來維護一個將接收log event的數組,如果數組中agent的數量大於1,那么將把第一個agent視為primary agent,剩下的為備選agent。當第一個agent無法連接時,將把log event發送給備選agent。
② batchSize,integer,一次給agent發送的log event的個數。
③ compress,boolean,當設置為true時,發送的message將使用gzip進行壓縮。
3、JMSQueueAppender VS. JMSTopicAppender
JMSQueueAppender的作用是將格式化的log event發送到JMSQueue上,同樣的,JMSTopicAppender的作用是將格式化的log event發送到JMSTopic上。JMSQueue和JMSTopic的區別是,JMSQueue只將一個message發送給一個consumer,而JMSTopic是將一個message發布(publish)給所有訂閱了這個message的訂閱者(subscribe)。更詳細的兩者間的區別可以【戳這里】
幾個重要的參數:
JMSQueueAppender:
① queueBindingName,String, 用來定位queue。
② factoryBindingName,String, 用來定位產生上下文信息的QueueConnectionFactory。
JMSTopicAppender:
① topicBindingName,String, 用來定位topic。
② factoryBindingName,String, 用來定位產生上下文信息的QueueConnectionFactory。
4、RewriteAppender
RewriteAppender可以讓符合篩選條件的log event在被其他appender輸出前被加工一下,比如對message中的密碼進行掩碼,或者向message中注入信息等。RewriteAppender需要一個RewritePolicy來指定重寫的規則。
幾個重要的參數:
① appender-ref,String,指定被重寫后的log event將發往哪個appender。
② rewritePolicy,RewritePolciy,用來描述重寫log event的規則。
RewritePolicy:
RewritePolicy是一個接口,有一個需要實現的方法名為rewrite,該方法接收一個log event對象作為參數,然后經過函數處理后返回該log event或新建一個log event返回。
Log4j2中已實現的兩種RewritePolicy有MapRewritePolicy和PropertiesRewritePolicy。
【完整的參數設置、已實現的RewritePolicy和官方配置示例】
5、RollingFileAppender
RollingFileAppender是一個非常有意思的輸出器。它將log信息寫入一個文件后,會判斷是否滿足封存文件的要求,若滿足,則除非封存文件的動作。RollingFileAppender需要TriggeringPolicy來指定觸發封存的條件,另外還需要RolloverStrategy來告訴輸出器如何封存文件。
Log4j2中已提供的TriggeringPolicy有如下四種:
① CompositeTriggeringPolicy
復合型觸發策略。即將多個觸發條件邏輯或到一起,只要其中一個條件滿足,則觸發封存動作。
② OnStartup Triggering Policy
這一觸發策略不需要參數設置,它會自行判斷log文件的創建時間和JVM的啟動時間。若log文件的創建時間早於JVM的啟動時間,則將原來的log文件封存,然后創建一個新的空白log文件。
③ SizeBased Triggering Policy
這一觸發策略基於對log文件大小的判斷。當log文件大於設定的閾值時,將觸發封存動作。可設定的log文件大小的單位有bytes、KB、MB或GB。
④ TimeBased Triggering Policy
基於時間的觸發策略。該策略主要是完成周期性的log文件封存工作。有兩個參數:
interval,integer型,指定兩次封存動作之間的時間間隔。
modulate,boolean型,說明是否對封存時間進行調制。若modulate=true,則封存時間將以0點為邊界進行偏移計算。比如,modulate=true,interval=4hours,那么假設上次封存日志的時間為03:00,則下次封存日志的時間為04:00,之后的封存時間依次為08:00,12:00,16:00,。。。
Log4j2中實現的RolloverStrategy為Default Rollover Strategy,它有三個參數可以設置,分別為:
fileIndex,String,有兩個選擇“max”或“min”。設置為“max”意味着將最新的日志信息封存在序號較大的封存文件中。“min”則相反。
min,integer,封存文件的序號的起始值。
max,integer,封存文件的序號的最大值。(超過最大值時,將有文件被刪除)
相當於min和max兩個參數設置了一個保存窗口,超出這個窗口的日志文件將會被刪除。
【完整的參數設置、TriggeringPolicy和RolloverStrategy的用法示例】
6、RoutingAppender
通過路由規則來評價一個log event后,決定它下一個被發往的appender。RoutingAppender有一個重要的參數名為routes,是Routes型數據,用來描述該appender的路由規則。
7、SMTPAppender
SMTPAppender主要用來給指定的E-mail發送log event(這種情況一般用在event的安全級別超過ERROR或FATAL時,event的安全分級可以參考【此文】之日志記錄小節)。SMTPAppender有很多重要的參數以完成log event發送到指定E-mail。
① bcc,String,由逗號分隔的幾個盲抄送地址。(盲抄送就是說收件人的地址不會顯示在郵件信息中)
② cc,String,由逗號分隔的幾個明抄送地址。(明抄送就是說收件人的地址將顯示在郵件信息中)
③ bufferSize,integer,信中所能包含的最大log event的數量。
④ from,String,發件人的地址。
⑤ layout,Layout,log event的布局格式。默認為SerializedLayout。
⑥ replyTo,String,回信的地址。
⑦ smtpHost,String,要發送到的SMTP的主機名。(此參數是必需的)
⑧ smtpPassword,String,通過SMTP服務器所需的密碼。
⑨ smtpPort,integer,SMTP服務的端口號。
⑩ smtpProtocol,String,使用的協議。默認為"smtp"。
其他還有smtpUsername(通過SMTP server所需的用戶名),to(接收者的郵件地址)等。
8、SocketAppender
將log event輸出到一個遠程服務器上(需指定服務器名和端口號),數據可以以任意指定的格式經由TCP或UDP協議發送。
SocketAppender中比較重要的參數有:
① host,String,指定服務器的主機名。(必需)
② immediateFlush,boolean,是否立即flush,還是等待緩存到一定大小后在flush。
③ layout,Layout,log event輸出的格式。
④ port,integer,遠程服務器堅挺log event的應用的端口號。
⑤ protocol,String,發送log event所使用的協議,"TCP" 或"UDP"。
⑥ reconnectionDelay,integer,當連接斷開時,延遲等待的ms數。
9、SyslogAppender
SyslogAppender跟SocketAppender一樣,是將log event發送到遠程服務器上,但是使用的是BSD Syslog格式。關於Syslog格式可以【戳這里】
10、AsynchAppender
將一個LogEvent異步地寫入多個不同輸出地。在AsynchAppender中有一個參數,名為“appender-ref”,用來指定要發送到的appender的名稱。AsynchAppender維護了一個隊列,隊列中存放了需要異步發送的LogEvent,隊列中LogEvent的個數可以通過“bufferSize”參數來指定。另外,還有一個“blocking”參數來指定是否對AsynchAppender的LogEvent隊列上鎖,如果blocking=true,那么在隊列滿員的情況下,新到達的LogEvent將等待,直到有空位。若blocking=false,那么在隊列滿員的情況下,將把新到的LogEvent轉到error appender。
11、ConsoleAppender
將LogEvent輸出到命令行。有兩個比較有意思的參數,一個是layout,用來指定輸出字串的格式(format);另一個是target,用來指定輸出的是 "SYSTEM_OUT" 還是 "SYSTEM_ERR",默認情況下是"SYSTEM_ERR"。
12、FailoverAppender
維護一個failover appenders隊列,系統先嘗試一個主appender(primary appender),若不成功,則嘗試failover隊列中的Appenders,直到有一個成功為止,或都不成功。比較重要的參數有:
primary(String型):用來指定主appender的名稱。
failovers(String[]型):一個appender數組,指定的備選的其他appenders。
retryInterval(integer型):用來設定隔多少秒重新嘗試主appender,默認為60秒。
參考資料: