log4j2中日志異步打印的示例分析

這篇文章給大家分享的是有關(guān)log4j2中日志異步打印的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鄱陽ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鄱陽網(wǎng)站制作公司

log4j2支持日志的異步打印,日志異步輸出的好處在于,使用單獨的進(jìn)程來執(zhí)行日志打印的功能,可以提高日志執(zhí)行效率,減少日志功能對正常業(yè)務(wù)的影響。

異步日志在程序的classpath需要加載disruptor-3.0.0.jar或者更高的版本。

Asynchronous Loggers是一個新增特性在Log4j 2 ,可以實現(xiàn)完全異步也可以和同步混合使用,還可以只異步化Appender,以提升系統(tǒng)性能,官方數(shù)據(jù)顯示混合沒有完全異步化效果好。

1,完全異步模式:

這種異步日志方式,不需要修改原來的配置文件,Logger仍然使用<root> and <logger>

只需要在主程序代碼開頭,加一句系統(tǒng)屬性的代碼:

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

或者設(shè)置啟動參數(shù):

DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

2,異步和非異步混合輸出模式

在配置文件中Logger使用<asyncRoot> 或 <asyncLogger>,而且<asyncRoot> 或 <asyncLogger>可以和<root> 或 <logger>混合使用。

<?xml version="1.0" encoding="UTF-8"?>

<!-- No need to set system property "Log4jContextSelector" to any value
when using <asyncLogger> or <asyncRoot>. -->

<Configuration status="WARN">
<Appenders>
<!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
<RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"
immediateFlush="false" append="false">
<PatternLayout>
<Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
</PatternLayout>
</RandomAccessFile>
</Appenders>
<Loggers>
<!-- pattern layout actually uses location, so we need to include it -->
<AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
<AppenderRef ref="RandomAccessFile"/>
</AsyncLogger>
<Root level="info" includeLocation="true">
<AppenderRef ref="RandomAccessFile"/>
</Root>
</Loggers>
</Configuration>

這里需要注意的是,如果使用<asyncRoot> 或 <asyncLogger>,includeLocation="true"是必須要設(shè)置才會有類路徑等一些信息打印出來。

3,只異步化Appender

在<Appenders>標(biāo)簽里增加如下<Async>標(biāo)簽

<Async name="asyncAppender" includeLocation="true"> 
<AppenderRef ref="RandomAccessFile"/>
</Async>

然后在<Root>或者<Logger>標(biāo)簽中引用asyncAppender即可,這里includeLocation是增加在<Async>標(biāo)簽中的。

<Root level="info">
<AppenderRef ref="RandomAccessFile"/>
</Root>

無論是完全異步模式還是混合模式,在Appender標(biāo)簽中,immediateFlush屬性無論為true或者false,效果都是和設(shè)置false是一樣的。

4,性能對比

完全異步 > 混合模式 > 只異步化Appender > 同步

5,疑問

使用混合異步模式進(jìn)行多線程寫日志測試的時候,偶爾會出現(xiàn)日志沒有寫完的情況。是不是主線程執(zhí)行完了,不會等待寫日志的線程執(zhí)行完,就把進(jìn)程給停掉了? 在主線程的最后sleep幾秒,就沒有再出現(xiàn)日志寫不完的情況了。

感謝各位的閱讀!關(guān)于“l(fā)og4j2中日志異步打印的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)頁題目:log4j2中日志異步打印的示例分析
標(biāo)題來源:http://muchs.cn/article8/piceop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)