在log4j Appender内登录时的循环依赖关系

| 我正在编写一个log4j附加程序,该附加程序通过http将日志发送到服务器。我想使用apache-commons中的HttpClient来保持我的代码简洁漂亮。 现在的问题是HttpClient和Co.本身使用log4j。通常这是一件好事,但是当从log4j追加器实现中调用它们时,引入了循环引用或无穷循环,最终导致OutOfMemoryException。 当然,我可以在没有任何第三方库的情况下编写自己想要的东西,但是我只是想知道是否存在针对此类问题的已知解决方案?     
已邀请:
        这是一个很好的问题!遗憾的是log4j并没有在此帮助您。但是,我们可能会偏向于使用log4j来修复log4j!重要的概念是诊断上下文:
private static final String IN_APPEND_KEY = MyAppender.class.getName() + \".inAppend\";
public void append(LoggingEvent e) {
    if (e.getMDC(IN_APPEND_KEY) != null) return;
    MDC.put(IN_APPEND_KEY, this);
    try {
        <your code here>
    } finally {
        MDC.remove(IN_APPEND_KEY);
    }
}
您基本上想设置一个标志,该标志将使您的附加程序的执行流程“旅行”。至少从理论上讲,这正是诊断上下文所要做的。它是线程本地的,并且跨线程继承。精心编写的代码甚至可以跨其他边界(例如消息队列)保留上下文。那会是多么酷:您的附加程序将日志消息放在HTTP请求队列中,该队列保存诊断上下文并在请求运行时恢复诊断上下文,HTTP库记录错误,而您的附加程序仍会检测到循环!这几乎是您所要求的最好的东西。     
        为什么Apache HttpClient的记录器使用您的Appender?给它另一个Appender,控制台或其他东西。     

要回复问题请先登录注册