Open lrwh opened 1 month ago
AsyncLoggerContextSelector 是 Apache Log4j 2 中的一个组件,它用于异步处理日志事件。在 Log4j 2 中,异步日志记录是一种性能优化技术,它允许应用程序继续执行其任务,而日志事件的记录操作则在后台异步完成。
异步日志记录的工作原理是,应用程序将日志事件发送到一个内部队列,而不是直接写入到日志目标(如控制台、文件等)。然后,一个或多个后台线程从队列中取出这些事件,并执行实际的日志写入操作。这种方式可以显著减少日志记录对应用程序性能的影响,特别是在高负载情况下。
AsyncLoggerContextSelector 的作用包括:
选择 LoggerContext:在 Log4j 2 中,LoggerContext 是日志系统的中心组件,包含了配置信息和日志记录器。AsyncLoggerContextSelector 负责选择或创建适当的 LoggerContext 实例,用于异步日志记录。
配置异步日志记录:它可以根据配置文件或程序中的设置,配置异步日志记录的行为,例如设置队列的大小、后台线程的数量等。
管理日志事件的生命周期:AsyncLoggerContextSelector 还负责管理日志事件从生成到记录的整个生命周期,确保即使在高并发情况下,日志事件也能被正确处理。
通过设置系统属性 log4j2.contextSelector 为 org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 来启用。这种方式使用了一个高性能的并发框架 Disruptor,并创建一个单独的线程来处理日志输出。
超出了 MDC 的边界,所以需要额外写逻辑来兼容处理。
经研究,无法将 trace 信息放置到 AsyncLoggerConfigDisruptor$Log4jEventWapper 对象中,也就是 contextData 为空,这个对象最终会把日志输出到终端。
可以从 message 处着手处理,比如重写message,将trace相关信息写入message当中。
AsyncLoggerContextSelector 在 Log4j 2 中用于配置异步日志记录,确保所有记录器都是异步的。但是,当涉及到 MDC(Mapped Diagnostic Context)参数时,异步日志记录可能会遇到问题,因为 MDC 是线程局部的,而异步日志记录可能在不同的线程中处理日志事件。