logback高級特性使用-異步記錄日誌

注意:該功能須要高版本才能支持,如1.0.11。

AsyncAppender,異步記錄日誌。

工做原理:
當Logging Event進入AsyncAppender後,AsyncAppender會調用appender方法,append方法中在將event填入Buffer(這裏選用的數據結構爲BlockingQueue)中前,會先判斷當前buffer的容量以及丟棄日誌特性是否開啓,當消費能力不如生產能力時,AsyncAppender會超出Buffer容量的Logging Event的級別,進行丟棄,做爲消費速度一旦跟不上生產速度,中轉buffer的溢出處理的一種方案。AsyncAppender有個線程類Worker,它是一個簡單的線程類,是AsyncAppender的後臺線程,所要作的工做是:從buffer中取出event交給對應的appender進行後面的日誌推送。

從上面的描述中能夠看出,AsyncAppender並不處理日誌,只是將日誌緩衝到一個BlockingQueue裏面去,並在內部建立一個工做線程從隊列頭部獲取日誌,以後將獲取的日誌循環記錄到附加的其餘appender上去,從而達到不阻塞主線程的效果。所以AsynAppender僅僅充當事件轉發器,必須引用另外一個appender來作事。

在使用AsyncAppender的時候,有些選項仍是要注意的。因爲使用了BlockingQueue來緩存日誌,所以就會出現隊列滿的狀況。正如上面原理中所說的,在這種狀況下,AsyncAppender會作出一些處理:默認狀況下,若是隊列80%已滿,AsyncAppender將丟棄TRACE、DEBUG和INFO級別的event,從這點就能夠看出,該策略有一個驚人的對event丟失的代價性能的影響。另外其餘的一些選項信息,也會對性能產生影響,下面列出經常使用的幾個屬性配置信息:

屬性名 類型 描述
queueSize int BlockingQueue的最大容量,默認狀況下,大小爲256。
discardingThreshold int 默認狀況下,當BlockingQueue還有20%容量,他將丟棄TRACE、DEBUG和INFO級別的event,只保留WARN和ERROR級別的event。爲了保持全部的events,設置該值爲0。
includeCallerData boolean 提取調用者數據的代價是至關昂貴的。爲了提高性能,默認狀況下,當event被加入到queue時,event關聯的調用者數據不會被提取。默認狀況下,只有"cheap"的數據,如線程名。

 


 

默認狀況下,event queue配置最大容量爲256個events。若是隊列被填滿,應用程序線程被阻止記錄新的events,直到工做線程有機會來轉發一個或多個events。所以隊列深度須要根據業務場景進行相應的測試,作出相應的更改,以達到較好的性能。

下面給出一個使用的配置示例:
緩存

<appender name="FILE" class= "ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 按天來回滾,若是須要按小時來回滾,則設置爲{yyyy-MM-dd_HH} -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                 <fileNamePattern>/opt/log/test.%d{yyyy-MM-dd}.log</fileNamePattern>
                 <!-- 若是按天來回滾,則最大保存時間爲1天,1天以前的都將被清理掉 -->
                 <maxHistory>30</maxHistory>
            <!-- 日誌輸出格式 -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                 <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
</appender>
     <!-- 異步輸出 -->
     <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
            <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
            <discardingThreshold >0</discardingThreshold>
            <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->
            <queueSize>512</queueSize>
            <!-- 添加附加的appender,最多隻能添加一個 -->
         <appender-ref ref ="FILE"/>
     </appender>
     
     <root level ="trace">
            <appender-ref ref ="ASYNC"/>
     </root>
相關文章
相關標籤/搜索