log4j2異步日志配置及官方文檔的問題澄清


配置及demo

方法一全部打開

加啟動參數 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
啟動參數的這個key有點說法:
按官方文檔說明http://logging.apache.org/log4j/2.x/manual/async.html#AllAsync key是-Dlog4j2.contextSelector=...
但是你如果親自做實驗,或親自使用過,可能就會發現問題,簡單的說跟你使用的版本有關:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector // 全版本支持
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector // 2.10.0以后版本支持
仔細看官方文檔上有一句

Note that system properties were renamed into a more consistent style in Log4j 2.10.0. All old property names are still supported which are documented here.

相關代碼(2.10.0以后版本):
參見 org.apache.logging.log4j.util.PropertiesPropertySource 和
org.apache.logging.log4j.util.PropertiesUtil.Environment
Environment中有三組配置數據,key不同,業務語義相同:

literal
{java.runtime.name=Java(TM) SE Runtime Environment}


normalized
{log4j2.javaRuntimeName=Java(TM) SE Runtime Environment} key 是log4j2.前綴 加上駝峰形式變量

tokenized
{[java, runtime, name]=Java(TM) SE Runtime Environment}  key是list

方法二同步異步混合

<!-- 使用異步日志時,啟用如下配置,異步配置默認不打印location。此種方法無需配置JVM啟動參數。 -->
<asyncRoot level="debug">
	<AppenderRef ref="Console" />
</asyncRoot>

一些說明

  • 默認不打印location信息,諸如代碼行號,類,方法等。 如果需要的話需要加上includeLocation="true",但是按官方說法會慢30-100倍。
  • 異步的時候,如果在真正打印日志時,日志信息中所引用的對象中的字段值發生了改變,比如"hello {}", user.name這種。會不會影響打印日志的准確性。答案是不會,因為log4j做了snapshot機制。

異步日志的弊端

異步日志不是只有優點沒有弊端的,官方給出了一些不使用的場景(Drawbacks):

  • 異常處理。即使有異常處理器,也不能覆蓋所有的案例。
  • 在一些使用了諸如 MapMessage 和 StructuredDataMessage 這種沒法通過snapshot規避異步打印時日志信息可能變化的問題
  • 在CPU很少的環境,比如就1個CPU
  • 打印日志的速度遠遠超過appender的吞吐。此時異步並不能解決問題,需要用更快的appender。


免責聲明!

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



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