【发布时间】:2016-12-28 00:47:55
【问题描述】:
我正在使用Netty 4.1.3-Final 和Logback 1.1.7,并且我希望使用MDC 来存储有关客户端连接的一些附加信息(IP 地址、客户端标识符等)所以它们可以包含在日志中。
Logback(和 Log4J)的 MDC 框架假设每个客户端都使用多个线程,并且映射的诊断上下文是在每个线程的基础上维护的。这在像 Netty 这样的现代事件驱动框架中当然不是完全正确的,它利用异步非阻塞事件并重用相同的线程池。
我正在考虑引入 2 个处理程序,一个添加在管道的开头,并添加 MDC 信息,一个添加到管道的末尾,然后将其清除。每个处理程序都可以是入站/出站处理程序,因此它可以同时处理入站和出站消息(显然对出站消息执行相反的操作,因为在 Netty 中为出站数据反向调用管道。)
假设同一通道的管道中的 Netty 通道处理程序由同一线程处理是否安全?
在通过管道时,它们是否以原子方式处理,没有任何机会将同一线程用于另一个通道?
如果我使用LengthFieldBasedFrameDecoder 重新组合碎片帧,会发生什么情况?
如果这种方法不起作用,是否有其他推荐或更安全的方法? (我正在考虑让我的处理程序扩展一些通用的基本处理程序,而不是将 MDC 设置在 channelRead 的开头并在其末尾删除它,但这意味着如果我使用其他处理程序,例如 Netty ReadTimeoutHandler,他们不会得到 MDC,因为它不会在整个管道中设置。)
在这种情况下正确的方法是什么?
【问题讨论】:
-
在我看来,是的。在调试 netty 项目时,您会看到当前打开的每个会话/连接都有一个线程。由于会话/连接总是有它自己的上下文,当
sessionOpened被 netty 调用时,您可以将 MDC 信息直接添加到上下文中。
标签: java multithreading netty logback