自定义log4j的Appender

时间:2025-03-23 09:14:06
自定义log4j 的Appender
 
appender 的生命周期
 
1.       appender 实例不存在,或许框架还没有配置好。
 
2.       框架实例化了一个新的 appender。这发生在配置器类分析配置脚本中的一个 appender 声明的时候。配置器类调用 () ,这等价于动态调用 new YourCustomAppender() 。框架这样做是为了避免被硬编码为任何特定的 appender 名称;框架是通用的,适用于任何 appender。
. =.
 
3.       框架判断 appender 是否需要 layout。如果该 appender 不需要 layout,配置器就不会尝试从配置脚本中加载 layout 信息。
在Appender接口中,有public boolean requiresLayout() 方法,如果return true;则要求layout,需在配置脚本中设置layout信息
. =.
 
4.       Log4j 配置器调用 setter 方法。在所有属性都已设置好之后,框架就会调用这个方法。
此时对应RollingFileAppender的每个Field,需要有一个setter方法,在配置脚本中也要进行设置
. =<project>.log
对应的在RollingFileAppender中,有
public void setFile(String file) {
    String val = ();
    fileName = val;
 }
其它的属性,如MaxFileSize ,也相同
 
5.       配置器调用 activateOptions() 方法。在所有属性都已设置好之后,框架就会调用这个方法。
OptionHandler 接口定义了activateOptions()方法,在全部属性设置好了之后,在该方法中进行必要的操作,如打开文件
if(fileName != null) {
      try {
    setFile(fileName, fileAppend, bufferedIO, bufferSize);
      }
      catch( e) {
    ("setFile("+fileName+","+fileAppend+") call failed.",
               e, ErrorCode.FILE_OPEN_FAILURE);
      }
    } else {
      //("File option not set for appender ["+name+"].");
      ("File option not set for appender ["+name+"].");
      ("Are you using FileAppender instead of ConsoleAppender?");
}
 
6.       Appender 准备就绪。 此刻,框架可以调用 append() 方法来处理日志记录请求。这个方法由 () 方法调用。
该方法为Appender中最关键的方法,append()中可以定义日志的输出,最简单的:
protected void append(LoggingEvent event){
    //if layout is required
    (().format(event));
}
 
7.       最后,关闭appender。 当框架即将要删除您的自定义 appender 实例时,它会调用您的 appender 的 close() 方法。 close() 是一个清理方法,意味着 您需要释放已分配的所有资源。它是一个必需的方法,并且不接受任何参数。它必须把 closed 字段设置为 true ,并在有人尝试使用关闭的 appender 时向框架发出警报。
public void close() {
        if ()
            return;
        = true;
    }
    注意:需要在主程序退出前,调用().removeAllAppender();这样才能调用Appender的close()方法.
 
编写自定义appender 的步骤
1.       扩展 AppenderSkeleton 抽象类。
2.       指定您的 appender 是否需要 layout。
3.       如果某些属性必须同时激活,则应该在 activateOptions() 方法内完成。
4.       实现 close() 方法。它必须把 closed 字段的值设置为 true 。记得释放所有资源。
5.       可选地指定要使用的默认 ErrorHandler 对象。系统默认为OnlyOnceErrorHandler,它发送出第一个错误的消息并忽略其余的所有错误,错误消息将输出到 。
6.         编写 append() 方法的代码。这个方法负责附加日志记录事件,并在错误发生时负责调用错误处理程序。