日志框架(二)------log4j 扩展 JdbcAppender输出器
?
?
log4j中提供了将日志记录到数据库中的输出器: org.apache.log4j.jdbc.JDBCAppender。通过以下配置即可生效
?
?JndiDataSourceAppender类定义:
?
??
配置文件:
?
## -----自定义 logger2 prepareSqlDbLog -------------##log4j.logger.prepareSqlDbLog=ERROR,prepareStatementDbLogAppenderlog4j.appender.prepareStatementDbLogAppender=cn.log4j.datasource.PrepareStatementJdbcAppenderlog4j.appender.prepareStatementDbLogAppender.URL=jdbc:mysql://localhost:3306/testlog4j.appender.prepareStatementDbLogAppender.driver=com.mysql.jdbc.Driverlog4j.appender.prepareStatementDbLogAppender.user=rootlog4j.appender.prepareStatementDbLogAppender.password=xiaodilog4j.appender.prepareStatementDbLogAppender.sql=insert into t_log4j_info(priority,message,catalog,time) values(?,?,?,?)log4j.appender.prepareStatementDbLogAppender.sqlParams=%p%m%c%d{yyyy-MM-dd HH:mm:ss}log4j.appender.prepareStatementDbLogAppender.bufferSize=10##--------------db ------------------##log4j.appender.db=cn.log4j.datasource.JndiDataSourceAppenderlog4j.appender.db.jndiName=java:comp/env/jdbc/mysql_loglog4j.appender.db.sql=insert into t_log4j_info(priority,message,catalog,time) values(?,?,?,?)log4j.appender.db.sqlParams=%p%m%c%d{yyyy-MM-dd HH:mm:ss}log4j.appender.db.bufferSize=5??
?
另外,通过分析源码了解下log4j的JdbcAppender是如何保证线程安全的:
?
JdbcAppender继承AppenderSkeleton抽象基类,AppenderSkeleton通过synchronized的doAppend方法调用抽象的append方法,所以子类JdbcAppender实现的append方法也会是线程顺序进入,
从而保证了append中调用的日志缓冲区(ArrayList)及数据库连接对象没有线程并发访问问题。
同时,在log4j运行期间,同一名称的logger存在唯一实例;声明的同一名称的appender也存在唯一实例。?
?
?
?
补充:发现一个更强大的 JdbcAppender :http://www.mannhaupt.com/danko/projects/index.html??
?
?