我正在使用 Netty 4.1.3-Final 和 Logback 1.1.7, 希望使用 MDC 存储一些关于客户端连接的附加信息(IP地址,客户端标识等),以便将它们包含在日志中。
Logback(和Log4J)的MDC框架假定每个客户端都在使用多个线程,并且映射的诊断上下文是按线程基础维护的。当然,在现代事件驱动的框架(如Netty)中,这并不完全正确,因为它们利用异步非阻塞事件并重用同一个线程池。
我想引入两个处理程序,在管道的开头添加一个处理程序,添加MDC信息,在管道的末尾添加另一个处理程序,然后清除它。每个处理程序可以是入站/出站处理程序,以便处理入站和出站消息(显然对于出站数据,由于在Netty中反向调用管道,它们会相互执行相反的操作)。
可以假设同一通道中的Netty通道处理程序由同一线程处理吗?它们是否原子地处理,没有机会在经过管道时使用同一线程用于另一个通道?
如果我正在使用LengthFieldBasedFrameDecoder来重新组装分段帧,在这种情况下会发生什么?
如果这种方法不起作用,是否有任何其他建议或更安全的方法?(我正在考虑让我的处理程序扩展一些通用基础处理程序,该处理程序在
channelRead
的开头设置MDC,并在其末尾删除它,但是这意味着如果我使用其他处理程序,例如Netty ReadTimeoutHandler,它们将无法获得MDC,因为它不会在整个管道中设置。)在这种情况下使用的正确方法是什么?
sessionOpened
时,可以直接将MDC信息添加到上下文中。 - Herr Derb