GuanceCloud / dd-trace-java

Datadog APM client for Java
https://docs.datadoghq.com/tracing/languages/java
Apache License 2.0
9 stars 3 forks source link

log4j2 async 异步方式传播日志链路增强 #80

Open lrwh opened 1 month ago

lrwh commented 1 month ago

AsyncLoggerContextSelector 在 Log4j 2 中用于配置异步日志记录,确保所有记录器都是异步的。但是,当涉及到 MDC(Mapped Diagnostic Context)参数时,异步日志记录可能会遇到问题,因为 MDC 是线程局部的,而异步日志记录可能在不同的线程中处理日志事件。

lrwh commented 1 month ago

AsyncLoggerContextSelector 是 Apache Log4j 2 中的一个组件,它用于异步处理日志事件。在 Log4j 2 中,异步日志记录是一种性能优化技术,它允许应用程序继续执行其任务,而日志事件的记录操作则在后台异步完成。

异步日志记录的工作原理是,应用程序将日志事件发送到一个内部队列,而不是直接写入到日志目标(如控制台、文件等)。然后,一个或多个后台线程从队列中取出这些事件,并执行实际的日志写入操作。这种方式可以显著减少日志记录对应用程序性能的影响,特别是在高负载情况下。

AsyncLoggerContextSelector 的作用包括:

  1. 选择 LoggerContext:在 Log4j 2 中,LoggerContext 是日志系统的中心组件,包含了配置信息和日志记录器。AsyncLoggerContextSelector 负责选择或创建适当的 LoggerContext 实例,用于异步日志记录。

  2. 配置异步日志记录:它可以根据配置文件或程序中的设置,配置异步日志记录的行为,例如设置队列的大小、后台线程的数量等。

  3. 管理日志事件的生命周期:AsyncLoggerContextSelector 还负责管理日志事件从生成到记录的整个生命周期,确保即使在高并发情况下,日志事件也能被正确处理。

lrwh commented 1 month ago

通过设置系统属性 log4j2.contextSelector 为 org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 来启用。这种方式使用了一个高性能的并发框架 Disruptor,并创建一个单独的线程来处理日志输出。

超出了 MDC 的边界,所以需要额外写逻辑来兼容处理。

lrwh commented 1 month ago

经研究,无法将 trace 信息放置到 AsyncLoggerConfigDisruptor$Log4jEventWapper 对象中,也就是 contextData 为空,这个对象最终会把日志输出到终端。

lrwh commented 1 month ago

可以从 message 处着手处理,比如重写message,将trace相关信息写入message当中。

lrwh commented 1 week ago

https://github.com/GuanceCloud/dd-trace-java/tree/liurui_log42_async