Log4j2之Appenders


前言

  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秒。

完整的參數介紹和官方配置示例

參考資料:

1、Log4j2 Appenders 官網介紹

2、jms topic與jms queue區別

3、Apache Flume

4、The Syslog Protocol

 


免責聲明!

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



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