29

如何在 log4j 中使用 AsyncAppender 将日志消息写入 Web 服务?我应该创建自己的 Appender 来扩展 AsyncAppender 还是只是将自定义附加程序附加到 AsyncAppender?如果第二个选择是正确的,我应该把 AsyncAppender 对象放在哪里?有什么例子吗?

4

3 回答 3

42

在 log4j 配置文件中添加 AsyncAppender,它将引用一个真正的 appender。演示:将 asyncappender 添加到 log4j.xml 中的控制台附加程序

<?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>
于 2012-10-23T07:41:46.770 回答
9

我们想使用 log4j.AsyncAppender,但在 log4j.property 文件中找不到任何设置方法来附加其他附加程序。所以我们扩展了 log4j.AsyncAppender 类并添加了一个 setter 来添加其他 appender。这有助于主程序线程独立于 log4j 的日志记录操作。详情如下。

log4j 条目:

使用 log4j 文件附加器“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”,通过扩展 log4j AsyncAppender 的自定义类 com.log.AsyncAppenderHelper 将上一步的文件附加程序“fileAppender”附加到 log4j AsyncAppender

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

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

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));
        }

     }
}
于 2013-02-27T20:27:04.567 回答
-7

回答我自己的问题。

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

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

于 2012-06-20T11:55:51.783 回答