log4j2日志異步打印(實(shí)例講解)
log4j2支持日志的異步打印,日志異步輸出的好處在于,使用單獨(dú)的進(jìn)程來執(zhí)行日志打印的功能,可以提高日志執(zhí)行效率,減少日志功能對正常業(yè)務(wù)的影響。
異步日志在程序的classpath需要加載disruptor-3.0.0.jar或者更高的版本。
Asynchronous Loggers是一個新增特性在Log4j 2 ,可以實(shí)現(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)日志寫不完的情況了。
以上這篇log4j2日志異步打印(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java解析pdf格式發(fā)票的代碼實(shí)現(xiàn)
為了減少用戶工作量及誤操作的可能性,需要實(shí)現(xiàn)用戶上傳PDF格式的發(fā)票,系統(tǒng)通過解析PDF文件獲取發(fā)票內(nèi)容,并直接將其寫入表單,以下文章記錄了功能實(shí)現(xiàn)的代碼,需要的朋友可以參考下2024-08-08SpringBoot用JdbcTemplates訪問Mysql實(shí)例代碼
本篇文章主要介紹了SpringBoot用JdbcTemplates訪問Mysql實(shí)例代碼,非常具有實(shí)用價值,需要的朋友可以參考下2017-05-05淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián))
這篇文章主要介紹了淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián)),具有一定借鑒價值,需要的朋友可以參考下。2017-12-12Java中HashMap與String字符串互轉(zhuǎn)的問題解決
本文介紹了Java中HashMap與String字符串互轉(zhuǎn)的問題解決,當(dāng)我們有需求將HashMap轉(zhuǎn)為Json格式的String時,需要使用FastJson/Gson將HashMap轉(zhuǎn)為String,感興趣的可以了解一下2022-03-03java常用工具類 XML工具類、數(shù)據(jù)驗(yàn)證工具類
這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括XML工具類、數(shù)據(jù)驗(yàn)證工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05