Log4J中使用自定义LoggingEvent

        最近在做项目时,碰到一个很头疼的问题,需要扩展log4J的入口。在入口处,传递一些系统参数,给log4J处理。例如日志信息入库操作。         查看log4j的源代码后发现,在log4J中,是用LoggingEvent类做为实体,存储日志信息,如果能够扩展LoggingEvent,增加需要的参数信息,就可以在JDBCAppender中获取系统参数信息了。         Log4J的入口类Logger提供了         public  static Logger getLogger(String name, LoggerFactory factory) {                   return LogManager.getLogger(name, factory);         }         这样一个方法,通过这个方法中的LoggerFactory参数,可以返回一个Logger实例。这样的话,可以自己写一个LoggerFactory,自定义的log4J入口。         之后定义一个自己的Logger类,并覆写父类中的         protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {                callAppenders(new LoggingEvent(fqcn, this, level, message, t));         }         方法,此方法中的LoggingEvent替换为自己定一个LoggingEvent子类。即可把相应的参数信息,传递到Appender进行处理即可了!         自定义的类如下:         1、生成Logger子类的工厂类

        

public class SinologFactory implements LoggerFactory {



	public Logger makeNewLoggerInstance(String name) {

		return (Logger)new SinoLogger(name);

	}



}
   2、自定义LoggingEvent,增加一个sinoSysname属性
public class SinoLoggingEvent extends LoggingEvent {



	public SinoLoggingEvent(String fqnOfCategoryClass, Category logger,

			Priority level, Object message, Throwable throwable,String sinoSysname) {

		

		super(fqnOfCategoryClass, logger, level, message, throwable);

		// TODO Auto-generated constructor stub

		this.sinoSysname=sinoSysname;

	}



	public SinoLoggingEvent(String fqnOfCategoryClass, Category logger,

			long timeStamp, Priority level, Object message, Throwable throwable,String sinoSysname) {

		super(fqnOfCategoryClass, logger, timeStamp, level, message, throwable);

		// TODO Auto-generated constructor stub

		this.sinoSysname=sinoSysname;

	}



	public SinoLoggingEvent(String fqnOfCategoryClass, Category logger,

			long timeStamp, Level level, Object message, String threadName,

			ThrowableInformation throwable, String ndc, LocationInfo info,

			Map properties,String sinoSysname) {

		super(fqnOfCategoryClass, logger, timeStamp, level, message, threadName,

				throwable, ndc, info, properties);

		// TODO Auto-generated constructor stub

		this.sinoSysname=sinoSysname;

	}

	protected String sinoSysname="";

	public String getSinoSysname(){

		return sinoSysname;

	}

}
      3、自定义Logger
 
public class SinoLogger extends Logger {

	static int i=0;

	protected String sinoSysname="";

	protected SinoLogger(String name) {

		super(name);

	}

	 private static final String FQCN = SinoLogger.class.getName();

	 public

	  static

	  Logger getLogger(String name, LoggerFactory factory) {

	    return LogManager.getLogger(name, factory);

	  }

	 protected

	  void forcedLog(String fqcn, Priority level, Object message, Throwable t) {

	    callAppenders(new SinoLoggingEvent(fqcn, this, level, message, t,sinoSysname));

	  }

	 protected void setSinoSysname(String sinoSysname){

		 this.sinoSysname=sinoSysname;

	 }
}
     

            4、自定义JDBCAppender

 

           

public class SinoJDBCAppender extends JDBCAppender {

	protected String getLogStatement(LoggingEvent event) {

		String aaa="";

		if (SinoLoggingEvent.class.isInstance(event)) {

			SinoLoggingEvent dd = (SinoLoggingEvent) event;

			

		}
		return aaa;

	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用log4j进行全局拦截的示例代码: 首先,我们需要定义一个实现了`org.apache.log4j.Appender`接口的类,用于处理日志输出。下面是一个简单的实现示例: ```java import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; public class MyCustomAppender extends AppenderSkeleton { @Override protected void append(LoggingEvent event) { // 处理日志事件 String message = event.getMessage().toString(); System.out.println("MyCustomAppender: " + message); } @Override public void close() { // 关闭资源等操作 } @Override public boolean requiresLayout() { return false; } } ``` 然后,我们需要在应用程序启动时,将该自定义的Appender添加到log4jLogger。可以在应用程序的入口处添加以下代码: ```java import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class MyApp { private static final Logger logger = Logger.getLogger(MyApp.class); public static void main(String[] args) { // 加载log4j配置文件 PropertyConfigurator.configure("log4j.properties"); // 添加自定义Appender logger.addAppender(new MyCustomAppender()); // 应用程序正常启动 // ... } } ``` 最后,我们需要在log4j的配置文件定义我们自定义的Appender。例如,我们可以在log4j.properties文件添加以下配置: ```properties log4j.rootLogger=DEBUG, MyCustomAppender log4j.appender.MyCustomAppender=com.example.MyCustomAppender log4j.appender.MyCustomAppender.layout=org.apache.log4j.PatternLayout log4j.appender.MyCustomAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ``` 这样,当应用程序有日志输出时,我们的自定义Appender就会处理该日志事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值