实现自定义log4j Appender其实很简单:
1、继承log4j公共的基类:AppenderSkeleton
2、打印日志核心方法:abstract protected void append(LoggingEvent event);
3、初始化加载资源:public void activateOptions(),默认实现为空
4、释放资源:public void close()
5、是否需要按格式输出文本:public boolean requiresLayout()
正常情况下我们只需要覆盖append方法即可。然后就可以在log4j中使用了
----------------------------------------------------------超简单的Java实例---------------------------------------------------------------------
demo代码:
Java代码
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
public class SystemOutAppender extends AppenderSkeleton {
private String prefix ;
@Override
protected void append(LoggingEvent event) {
System.out.println("###, " + prefix + " : "+ event.getMessage());
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public boolean requiresLayout() {
// TODO Auto-generated method stub
return false;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
Java代码
public static void main(String[] args) {
Logger log = LogFactory.getLog("sysoutLog") ;
log.info("System.out.print.....") ;
}
log4j.properties 配置
log4j.logger.sysoutLog=INFO, sysout
log4j.appender.sysout=SystemOutAppender
log4j.appender.sysout.prefix=@@@
执行main函数,输出结果
###, @@@ : System.out.print....
------------------------------------------------------------------------整些深奥点的理论------------------------------------------------------------------------------------------------------------
appender 的生命周期 1. appender 实例不存在,或许框架还没有配置好。 2. 框架实例化了一个新的 appender。这发生在配置器类分析配置脚本中的一个 appender 声明的时候。配置器类调用 Class.newInstance(YourCustomAppender.class) ,这等价于动态调用 new YourCustomAppender() 。框架这样做是为了避免被硬编码为任何特定的 appender 名称;框架是通用的,适用于任何 appender。e.g. log4j.appender.file=org.apache.log4j.RollingFileAppender 3. 框架判断 appender 是否需要 layout。如果该 appender 不需要 layout,配置器就不会尝试从配置脚本中加载 layout 信息。在Appender接口中,有public boolean requiresLayout() 方法,如果return true;则要求layout,需在配置脚本中设置layout信息e.g. log4j.appender.file.layout=org.apache.log4j.PatternLayout 4. Log4j 配置器调用 setter 方法。在所有属性都已设置好之后,框架就会调用这个方法。此时对应RollingFileAppender的每个Field,需要有一个setter方法,在配置脚本中也要进行设置e.g. log4j.appender.file.File=<project>.log对应的在RollingFileAppender中,有public void setFile(String file) { String val = file.trim(); fileName = val; }其它的属性,如MaxFileSize,也相同 5. 配置器调用 activateOptions() 方法。在所有属性都已设置好之后,框架就会调用这个方法。OptionHandler接口定义了activateOptions()方法,在全部属性设置好了之后,在该方法中进行必要的操作,如打开文件e.g if(fileName != null) { try { setFile(fileName, fileAppend, bufferedIO, bufferSize); } catch(java.io.IOException e) { errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.", e, ErrorCode.FILE_OPEN_FAILURE); } } else { //LogLog.error("File option not set for appender ["+name+"]."); LogLog.warn("File option not set for appender ["+name+"]."); LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");} 6. Appender 准备就绪。 此刻,框架可以调用 append() 方法来处理日志记录请求。这个方法由 AppenderSkeleton.doAppend() 方法调用。该方法为Appender中最关键的方法,append()中可以定义日志的输出,最简单的:protected void append(LoggingEvent event){ //if layout is required System.out.println(this.getLayout().format(event));} 7. 最后,关闭appender。 当框架即将要删除您的自定义 appender 实例时,它会调用您的 appender 的 close() 方法。 close() 是一个清理方法,意味着 您需要释放已分配的所有资源。它是一个必需的方法,并且不接受任何参数。它必须把 closed 字段设置为 true ,并在有人尝试使用关闭的 appender 时向框架发出警报。public void close() { if (this.closed) return; this.closed = true; } 注意:需要在主程序退出前,调用Logger.getRoot().removeAllAppender();这样才能调用Appender的close()方法. 编写自定义appender 的步骤1. 扩展 AppenderSkeleton 抽象类。 2. 指定您的 appender 是否需要 layout。 3. 如果某些属性必须同时激活,则应该在 activateOptions() 方法内完成。 4. 实现 close() 方法。它必须把 closed 字段的值设置为 true 。记得释放所有资源。 5. 可选地指定要使用的默认 ErrorHandler 对象。系统默认为OnlyOnceErrorHandler,它发送出第一个错误的消息并忽略其余的所有错误,错误消息将输出到 System.err。6. 编写 append() 方法的代码。这个方法负责附加日志记录事件,并在错误发生时负责调用错误处理程序。
相关文章
- 高自定义的博客园主题 Lite v1.4.7
- IOS开发之功能模块--自定义导航控制器类常用自定义的代码
- django中两张表有外键关系的相互查找方法,自定义json编码方法
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
- Java小程序之自定义数组队列的实现(高级画板重绘基础)
- 自定义键盘上的按钮
- 我的世界中国版怎么自定义皮肤 手游版个性化自制皮肤玩法
- 我的侠客出战配置在哪改 我的侠客自定义出战配置方法
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.lo .
- php微信2 获取自定义菜单中的access_token