如何在log4j中使用AsyncAppender?

29

如何使用Log4j中的AsyncAppender将日志消息写入Web服务?我应该创建扩展AsyncAppender的自定义Appender还是只需将自定义Appender附加到AsyncAppender?如果选择后者,则应在哪里获取AsyncAppender对象?是否有示例可供参考?

3个回答

42
在log4j配置文件中添加AsyncAppender,它将引用一个真实的appender。示例:在log4j.xml中向控制台appender添加asyncappender。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss aa} %t [%l] %m%n"/>
    </layout>
</appender>
<appender name="async" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="500"/>
    <appender-ref ref="console"/>
</appender>
<root>
    <priority value="all"></priority>
    <appender-ref ref="async"/>
</root>
</log4j:configuration>

3
出于性能方面的考虑,始终将根优先级约束在更高的级别上是更好的做法。请参见 https://dev59.com/2HA65IYBdhLWcg3w-jum#13144054。 - Vadzim
3
你能否提供相同的例子,但使用log4j.properties文件格式? - Kumar Manish
@KumarManish:AsyncAppender 只能使用 DOMConfigurator 进行配置,因此无法使用 .properties 格式。 - TMN

9
我们希望使用log4j.AsyncAppender,但是在log4j.property文件中找不到任何设置器方法来连接其他appender。因此我们扩展了log4j.AsyncAppender类,并添加了一个setter来添加其他appender。这有助于主程序线程独立于log4j的日志记录操作。详情如下。 log4j条目:
使用log4j File Appender 'fileAppender' 定义一个名为'com.noPath'的日志记录器。请注意,日志记录器路径无关紧要,因此命名为'com.noPath'。
log4j.logger.com.noPath=DEBUG,fileAppender
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=c:/test.log

定义业务所需的日志记录器,'com.business',将上一步的文件附加器 'fileAppender' 链接到log4j AsyncAppender中,通过一个自定义类 com.log.AsyncAppenderHelper 来扩展log4j AsyncAppender。

log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath

在类路径中可用的java类com.log.AsyncAppenderHelper扩展了log4j.AsyncAppender。

package com.log
import java.util.Enumeration;
import org.apache.log4j.Appender;
import org.apache.log4j.AsyncAppender;
import org.apache.log4j.Logger;

/*
 * This class helps configure to AsyncAppender from log4j as part of log4j.properties
 * You can inject other appenders to AsyncAppender using the AsyncAppenderHelper
 * This would free up the main program thread to be independent of log4j's logging operation
 * @Author http://www.linkedin.com/in/jobypgeorge
 */

public class AsyncAppenderHelper extends AsyncAppender{

    public AsyncAppenderHelper(){
        super();
    }

    public void setAppenderFromLogger(String name){
        Logger l = Logger.getLogger(name);

        Enumeration<Appender> e = l.getAllAppenders();

        while(e.hasMoreElements()){
             Appender a = e.nextElement();
             this.addAppender(a);
             System.out.println("The newAppender "+a.getName() +" attach status "+this.isAttached(a));
        }

     }
}

2
log4j.properties 中使用异步 appender 的好例子。 - hudi
小心,这很容易出问题。我尝试过这个方法,但是PropertyConfigurator在处理时会移除附加器并重新添加它们。我的AsyncAppenderHelper最终得到了一个关闭的附加器。这就是为什么你需要使用DomConfigurator(xml)来使用它的原因。 - Alan Yackel
2
@AlanYackel,没有办法在log4j.properties文件中使用它吗?我不能使用xml文件。 - hudi

-7

回答自己的问题。

在log4j配置文件中(通常是log4j.xml或log4j.properties),我们应该定义AsyncAppender,它将引用一个真实的appender(它可以是我们自己定义的类,就像在我的情况下一样)。

因此,我编写了一个WebServiceAppender类,它扩展了AppenderSkeleton并实现了3个抽象方法。主要方法是“append”,它连接到Web服务并将所有信息发送到它。就这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接