用asyncRoot配置對應的對接disruptor類是AsyncLoggerConfigDisruptor,用Log4jContextSelector啟動參數配置全局異步的對應的對接disruptor類是AsyncLoggerDisruptor。下面分析的是AsyncLoggerConfigDisruptor
disruptor的創建與啟動需要的部件實現
AsyncLoggerConfigDisruptor.start方法用來創建並啟動disruptor實例
創建disruptor需要EventFactory,ringBuffer的大小,ThreadFactory,ProducerType,等待策略waitStrategy
創建后需要設置ExceptionHandler,設置EventHandler。
發布(生產)事件的translator。
EventFactory
分是否可變(mutable字段)場景對應兩個不同的EventFactory。
不可變的factory的邏輯是:
@Override
public Log4jEventWrapper newInstance() {
return new Log4jEventWrapper();
}
可變的factory邏輯是:
public Log4jEventWrapper newInstance() {
return new Log4jEventWrapper(new MutableLogEvent());
}
會在 Log4jEventWrapper的構造函數中傳入MutableLogEvent實例。
ringBuffer的大小
是根據AsyncLoggerConfig.RingBufferSize配置值算出來的。
這個配置項的值最小不能小於128,默認值分兩種情況進行設定:如果啟用了ENABLE_THREADLOCALS(優化GC的一個配置項),那么默認值是4 * 1024,否則是256 * 1024。
這個配置是通過System properties指定,同樣存在不同版本,配置項名稱不一致的情況,log4j2.asyncLoggerRingBufferSize (AsyncLogger.RingBufferSize)。詳細可以參見這里
ThreadFactory
主要是定制線程名:
線程名格式是:"AsyncLogger