Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在log4j Appender中登录时的循环依赖关系_Java_Log4j_Appender - Fatal编程技术网

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

Java 在log4j Appender中登录时的循环依赖关系,java,log4j,appender,Java,Log4j,Appender,我正在编写一个log4j appender,它通过http将日志发送到服务器。我想使用ApacheCommons中的HttpClient来保持代码的简洁性 现在的问题是HttpClient和Co.本身使用log4j。通常这是一件好事,但当从log4j appender实现中调用它们时,会引入循环引用或无限循环,最终导致OutOfMemoryException 当然,我可以在没有任何第三党图书馆的情况下写我想要的东西,但我只是想知道是否有已知的解决此类问题的方法 为什么来自Apache HttpC

我正在编写一个log4j appender,它通过http将日志发送到服务器。我想使用ApacheCommons中的HttpClient来保持代码的简洁性

现在的问题是HttpClient和Co.本身使用log4j。通常这是一件好事,但当从log4j appender实现中调用它们时,会引入循环引用或无限循环,最终导致OutOfMemoryException


当然,我可以在没有任何第三党图书馆的情况下写我想要的东西,但我只是想知道是否有已知的解决此类问题的方法

为什么来自Apache HttpClient的记录器使用您的Appender?给它另一个附加器、控制台或其他东西。

这是一个很好的问题!很遗憾log4j没有在这里帮助你。但是我们可以使用log4j来修复log4j!重要的概念是:

private static final String IN_APPEND_KEY=MyAppender.class.getName()+“.inaappend”;
公共无效附加(记录事件e){
if(e.getMDC(IN_APPEND_KEY)!=null)返回;
put(在_APPEND _键中,this);
试一试{
}最后{
MDC.remove(在追加键中);
}
}

您基本上希望设置一个标志,该标志将随着appender的执行流“移动”。至少在理论上,这正是诊断上下文所做的。它是线程本地的,跨线程继承。精心编写的代码甚至可以跨其他边界(如消息队列)保留上下文。这有多酷:您的appender将日志消息放在HTTP请求队列中,队列保存诊断上下文并在请求运行时将其还原,HTTP库记录错误,并且您的appender仍然检测循环!这几乎是你能要求的最好的东西。

说得好。但如果以后有人重新配置它,问题仍然可能发生。我想让它“可发布”…检查它是否会给出循环行为,并抛出一个异常来解释原因。
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);
    }
}