请自行google,不重复。
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完成.
但这些扩展对不同的容器和部署方式可能会有影响,请自行裁减。
比如在一个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
把重要的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可以达到异步写入的效果。