如何使用AsyncAppender在log4j的?(How to use AsyncAppender

2019-06-25 15:18发布

如何才能写日志消息给Web服务使用AsyncAppender在log4j的? 我要创造我自己的Appender这将延长AsyncAppender或只是将自定义的appender到AsyncAppender? 如果第二个选择是正确的,我应该在哪里拿AsyncAppender对象? 是否有任何的例子吗?

Answer 1:

在log4j的配置文件,该文件将涉及到一个真正的appender添加AsyncAppender。 对于演示:将asyncappender到的log4j.xml控制台的appender

<?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>


Answer 2:

我们想用log4j.AsyncAppender,但找不到任何setter方法在log4j.property文件附加其他附加目的地。 因此,我们扩展了log4j.AsyncAppender类并添加二传手添加其他附加目的地。 这有助于主程序线程是独立的log4j的日志操作。 下面的详细信息。

log4j的条目:

定义一个记录器“com.noPath”与log4j的文件追加程序,“fileAppender”。 需要注意的是记录器路径是无关紧要的,故而得名“com.noPath”

log4j.logger.com.noPath=DEBUG,fileAppender
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=c:/test.log

通过延伸的log4j AsyncAppender自定义类com.log.AsyncAppenderHelper定义记录,企业的需求,“com.business”,附加上一步的文件附加目的地,“fileAppender”,将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));
        }

     }
}


Answer 3:

回答我的问题。

在log4j的配置文件(通常是的log4j.xml或log4j.properties),我们应该定义AsyncAppender这将是指一个真正的appender(也可能是我们自己定义的类像我的情况)。

所以我写了延伸AppenderSkeleton并实现3种抽象方法的WebServiceAppender类。 主要方法是“追加”,它连接到Web服务,并将所有信息吧。 而已。



文章来源: How to use AsyncAppender in log4j?