问题描述
如何在log4j中使用asyncappender来将日志消息写入Web服务?我应该创建自己的appender,以扩展异步或仅将自定义附录器附加到asyncappender上?如果第二个选择是正确的,我应该在哪里取异步对象?有例子吗?
推荐答案
回答我自己的问题.
在log4j config文件(通常是log4j.xml或log4j.properties)中,我们应该定义syncappender,该syncappender指的是一个真实的appender(在我的情况下可能是我们自己的定义类).
> >所以我写了一个WebServiceAppender类,该类扩展了附录骨骼并实现了3种摘要方法.主要方法是"附加",该方法连接到Web服务并将所有信息发送给它.就是这样.
其他推荐答案
在log4j配置文件中添加syncappender,该文件将参考真实的appender. 用于演示:在log4j.xml
中添加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>
其他推荐答案
我们想使用log4j.asyncappender,但找不到任何setter方法可以在log4j.property文件上附加其他附录.因此,我们扩展了log4j.asyncappender类,并添加了一个设置器来添加其他附录.这有助于主程序线程独立于Log4J的记录操作.下面的详细信息.
log4j条目:
使用log4j文件appender," fileappender"定义logger" 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.asyncappenderhelper将业务所需的记录器定义为" com.business",将上一个步骤的文件申请人附加到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)); } } }
问题描述
How to use AsyncAppender in log4j in order to write log message to the web service? Should I create my own Appender which would extend AsyncAppender or just attach custom appenders to the AsyncAppender? If the second choice is correct, where should I take the AsyncAppender object? Is there any example?
推荐答案
Answering my own question.
In the log4j config file(usually it's log4j.xml or log4j.properties) we should define AsyncAppender which would refer to a real appender(it may be our own defined class like in my case).
So I wrote a WebServiceAppender class which extends AppenderSkeleton and implements 3 abstract methods. The main method is "append" which connects to the web service and sends all the information to it. That's it.
其他推荐答案
Add AsyncAppender in log4j config file which will refer to a real appender. For demo: adding asyncappender to console appender in 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>
其他推荐答案
We wanted to use log4j.AsyncAppender but couldn't find any setter methods to attach other appenders at the log4j.property file. So we extended the log4j.AsyncAppender class and added a setter to add other appenders. This has helped the main program thread to be independent of log4j's logging operation. The details below.
log4j entry:
Define a logger 'com.noPath' with log4j File Appender, 'fileAppender'. Note that the logger path is immaterial and hence the name 'com.noPath'
log4j.logger.com.noPath=DEBUG,fileAppender log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender log4j.appender.fileAppender.File=c:/test.log
Define the logger that business needs, 'com.business', Attach the File appender of previous step, 'fileAppender', to the log4j AsyncAppender through a custom class com.log.AsyncAppenderHelper which extends log4j AsyncAppender
log4j.logger.com.business=DEBUG,asyncLog log4j.appender.asyncLog=com.log.AsyncAppenderHelper log4j.appender.asyncLog.appenderFromLogger=com.noPath
The java class com.log.AsyncAppenderHelper extending log4j.AsyncAppender, have it available in the class path.
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)); } } }