【问题标题】:Inherit appenders from calling instance in log4j or logback从调用 log4j 或 logback 中的实例继承附加程序
【发布时间】:2010-05-16 19:00:48
【问题描述】:

在我的程序中,我有 2 个独立的日志事件流(为简单起见,将它们称为流,实际上是 2 个附加程序)。 Stream1 包含客户端日志记录,Stream2 包含控制日志记录。现在这似乎很容易,除了某些类可以同时在客户端日志记录和服务器日志记录中,具体取决于具体情况。更复杂的是,客户端想要的命令发生在 2 个单独的线程中(一个从线程池中随机获取),因此无法使用 MDC 或 NDC 进行任何类型的跟踪。

如果记录器可以从调用 instance 继承附加程序,那么真正简化这一点的方法。这样我就可以为 2 个记录器设置 2 个附加程序并完成。但是我不知道如何干净或轻松地做到这一点。任何人都可以就如何做到这一点提供任何建议吗?

注意:如果需要传递一些东西,我确实有一个事件 bean,它可以传递给链中的所有东西,如果需要的话可以使用。

【问题讨论】:

    标签: java logging log4j logback


    【解决方案1】:

    您已经提到客户端处理发生在多个线程中,因此简单的ThreadLocal 方法可能行不通……但ThreadGroupLocal 可行吗?

    见 [Are there thread group-local variables in Java?

    我建议的方法是只在日志框架中注册一个附加程序。该附加程序将是您编写的内容。该实现将委托给 ThreadLocal/ThreadGroupLocal 附加程序。 that appender 将是特定于客户端或控件的。

    另请注意,您的附加程序不应配置在异步或批处理抽象之下。

    【讨论】:

    • 好像我会为每个客户端请求创建一个池,这会破坏池的点。如果没有,那么我将不得不创建一个非常复杂的日志系统,每个线程都有一个 MDC 设置。技术上可行,但绝对荒谬。今天,我使用堆栈跟踪的希望落空了,因为我发现跟踪不会回到调用类,这并不奇怪。想想我一直在考虑写的那个自定义线程池是时候了。
    • 回来我会在应得的地方给予信任。我在网上找到了一个 ThreadGroupLocal 类,并使用了一个检查局部变量的附加程序。效果很好,我只想说,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多