Log4j 中阶应用
1. 把重要的业务日志异步批量写入数据库
配置文件示例:

log4j.logger.business=INFO,db 

log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender 

log4j.appender.db.BufferSize=10 

log4j.appender.db.URL=jdbc:hsqldb:res:/hsqldb/bookstore 

log4j.appender.db.driver=org.hsqldb.jdbcDriver 

log4j.appender.db.user=sa 

log4j.appender.db.password= 

log4j.appender.db.sql=INSERT INTO SS_LOG4J_LOG (PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')


log4j.appender.db.layout=org.apache.log4j.PatternLayout log4j提供了简单灵活且不影响性能的机制, 将重要业务日志写入数据库,方便日后的查询:

1. 建立一个任意命名的日志记录表,在log4j.properties里设置连接参数,根据刚才建的表名列名,编写插入的语句。

2. BufferSize=10 这样的参数可以让日志异步批量写入,不会影响系统性能。

3. 业务日志log最好不要用原来的package结构,而是在项目里协调一个独立的名字,如business。

Log buzzLog = LogFactory.getLog("business"); 4. 以上功能的演示代码在bookstore example 的OrderManager.java,测试代码在bookstore example的DBLogTest.java。

2.Spring 对log4j的几个增强
个人建议都不要使用。

1. 定时刷新log4j properties文件,无须重启服务器Apply 新的log4j设置。

虽然这是个J2EE Best Practice,但在Spring的JavaDoc里注明了不推荐用于生产环境,因为服务器重启的时候,那条watch thread 不会关闭。

2.将log4j.properties 文件放在WEB-INF/log4j.properties。

这种增强看不出有什么好处,而且如果放WEB-INF,测试的时候就不能输出log4j信息了,除非像Appfuse那样把WEB-INF也设为class path,不过这种设法只适用于Ant脚本的情况。

3. 通过设定{web.root} 这样的系统变量,将log文件放到项目的WEB-INF目录中

log4j.appender.logfile.File=${bookstore.root}/WEB-INF/logs /bookstore.log这样做的好处是路径比较稳定,但如果是war式的部署,每次重新部署的时候就会把原来的log文件全部删掉,遇上jboss 这种不解压war包的应用服务器就更会出错,所以把log文件放WEB-INF/logs不是一个好的选择。


其实logfile路径的规则是,如果不是绝对路径,就以应用运行的目录作为相对路径的根目录。

所以我平时这样定义,一般就指向tomcat 和很多应用服务器的logs目录:

log4j.appender.logfile.File=../logs/bookstore.log这样的缺点是,假设你把Tomcat /bin目录添加到了PATH变量的值中去,并喜欢从Windows开始菜单的运行框里输入"startup.bat"启动Tomcat,这时Log4j 的日志就会被放到C:\Documents And Settings\logs目录中去。

3. 忽略某些类库框架的不必要的信息
控制第三方框架类库的logging level,可以避免满屏都是不重要的info,把真正重要的信息掩盖了。

# Changing the log level to DEBUG when debug 

log4j.logger.org.springframework=WARN 

# Changing the log level to DEBUG will display SQL Hibernate generated 

log4j.logger.org.hibernate=WARN 

log4j.logger.org.hibernate.SQL=ERROR