log4j2用Log4jContextSelector启动参数配置全局异步日志是如何使用disruptor

Posted simoncook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2用Log4jContextSelector启动参数配置全局异步日志是如何使用disruptor相关的知识,希望对你有一定的参考价值。

log4j2用asyncRoot配置异步日志是如何使用disruptor差异有几个:

给disruptor实例的EventFactory不同

此处EventFactory采用的是RingBufferLogEvent.FACTORY,newInstance逻辑大致是:

public RingBufferLogEvent newInstance() 
    final RingBufferLogEvent result = new RingBufferLogEvent();
    if (Constants.ENABLE_THREADLOCALS) 
        result.messageText = new StringBuilder(Constants.INITIAL_REUSABLE_MESSAGE_SIZE);
        result.parameters = new Object[10];
    
    return result;

创建的是 RingBufferLogEvent实例。该对象封装了日志输出的执行动作等。

给disruptor的threadFactory的参数不同

thread factory的名字是"AsyncLogger[" + contextName + "]"

给disruptor的EventHandler不同

此处用RingBufferLogEventHandler,对接RingBufferLogEvent实例处理日志写出。

给disrupto的Translator不同

此处用RingBufferLogEventTranslator,对接RingBufferLogEvent实例组装日志信息。

事件进入队列方式不同

封装了一个叫tryPublish的方法进入队列。

以上是关于log4j2用Log4jContextSelector启动参数配置全局异步日志是如何使用disruptor的主要内容,如果未能解决你的问题,请参考以下文章

用vulfocus靶场环境复现Log4j2远程命令执行漏洞

用vulfocus靶场环境复现Log4j2远程命令执行漏洞

用vulfocus靶场环境复现Log4j2远程命令执行漏洞

记一次log4j2引发的渗透测试

深入源码解析日志框架Log4j2

ELK系列 - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例