log4j日志处理

1.log4j与Jakarta Commons Logging基础

  请自行google,不重复。

 2.Spring对Log4j的增强

 spring对可以有如下的cream:
   1. 动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。

  (其实,spring是把这delegate给log4j PropertyConfigurator的configureAndWatch,多开一条线程来完成的。)

2. 把log文件定在 webapp相关的路径,如/WEB-INF/logs/ 而不需要写绝对路径。

3. 可以把log4j.properties放在/WEB-INF/ ,而不是Class-Path。

具体配置见web.xml里面的相关部分,主要是靠spring的Log4jConfigListener完成.

但这些扩展对不同的容器和部署方式可能会有影响,请自行裁减。

3.默认写入操作员ID

    比如在一个ServletFilter里实现如下代码 

      Customer customer = (Customer) session.getAttribute("customer");
      MDC.put("userid", 
 customer.getLoginid());

   则log4j会线程安全的把cusomer id 写入MDC的userId变量中,而userID变量的使用见下。

   springside里面实现了此filter的基类,filter子类只需实现userid String的获取即可。见BaseLog4JUserFilter.java和Log4JUserFilter.java

4. 异步写入数据库

把重要的log写入数据库,使其具备查询过滤的能力。同时为了不影响程序的运行速度,一般采用异步写入的形式。

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=20
log4j.appender.db.URL=jdbc:hsqldb:hsql://localhost:9002/bookstore
log4j.appender.db.driver=org.hsqldb.jdbcDriver
log4j.appender.db.user=sa
log4j.appender.db.password=
log4j.appender.db.sql=INSERT INTO LOG4J_LOG (LOGINID,PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES('%X{userId}','%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')

     在数据库中建立任意的log表, 通过sql属性指定表名和列名, 而BufferSize=100可以达到异步写入的效果。

你可能感兴趣的:(spring,sql,log4j,Web,HSQLDB)