Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lrwh opened this issue May 15, 2024 · 6 comments
Open

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

lrwh opened this issue May 15, 2024 · 6 comments
Assignees

Comments

@lrwh
Copy link
Collaborator

lrwh commented May 15, 2024

No description provided.

@lrwh lrwh self-assigned this Jun 3, 2024
@lrwh
Copy link
Collaborator Author

lrwh commented Jun 3, 2024

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

@lrwh
Copy link
Collaborator Author

lrwh commented Jun 3, 2024

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

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

AsyncLoggerContextSelector 的作用包括:

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

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

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

@lrwh
Copy link
Collaborator Author

lrwh commented Jun 3, 2024

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

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

@lrwh
Copy link
Collaborator Author

lrwh commented Jun 7, 2024

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

@lrwh
Copy link
Collaborator Author

lrwh commented Jun 7, 2024

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

@lrwh
Copy link
Collaborator Author

lrwh commented Jul 1, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant