如何在log4j中使用AsyncAppender以便将日志消息写入Web服务?我应该创建自己的Appender,它会扩展AsyncAppender或只是将自定义appender附加到AsyncAppender?如果第二个选择正确,我应该在哪里使用AsyncAppender对象?有什么例子吗?
dee*_*dak 41
在log4j配置文件中添加AsyncAppender,它将引用一个真正的appender.对于演示:在log4j.xml中将asyncappender添加到console 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>
Run Code Online (Sandbox Code Playgroud)
我们想使用log4j.AsyncAppender但找不到任何setter方法来在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
Run Code Online (Sandbox Code Playgroud)
通过自定义类com.log.AsyncAppenderHelper定义业务需要的记录器,'com.business',将上一步的File appender,'fileAppender'附加到log4j AsyncAppender,扩展log4j AsyncAppender
log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath
Run Code Online (Sandbox Code Playgroud)
扩展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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*gey -7
回答我自己的问题。
在 log4j 配置文件(通常是 log4j.xml 或 log4j.properties)中,我们应该定义 AsyncAppender ,它将引用真正的附加程序(它可能是我们自己定义的类,就像我的例子一样)。
所以我写了一个WebServiceAppender类,它扩展了AppenderSkeleton并实现了3个抽象方法。主要方法是“append”,它连接到 Web 服务并向其发送所有信息。就是这样。
| 归档时间: |
|
| 查看次数: |
42097 次 |
| 最近记录: |