配置及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。