日期:2014-05-16 浏览次数:20824 次
??? 一、写前唠叨
????? 最近写了一个关于将对象通过log4j的形式保存到数据库的例子,因对这个log4j正在入门,所以做之前查过很多资料,不过网上的信息比较简单,如下:
??? 1.所有信息几乎全部在配置文件中进行获取,如:数据库相关的连接、用户名、密码、sql语句;日志相关的appender、输出、格式化、参数;
??? 2.写到数据库中的仅是一个字符串而不是一个对象,如:将一个对象本身以及它的各个数据作为一条记录存到数据库
??? 3.代码的灵活性较低,如:只能存比较简单的数据类型,如保存一个对象及属性的话,就不太容易做了。
? 当然,网上的这些资料当然是为了最基础的入门而做的,因此简单了些,但也不乏比较深奥的资料,比如穿件连接池,考虑缓存等等。。
?? 二、我的做法
???? 1.通过继承JDBCAppender实现日志的写入的
???? 2.通过JDBC连接数据库(也可通过HIBERNATE)
???? 3.数据库和log4j的基本信息配置到properties中,但数据库可以自由选择多种数据库(在配置文件中配置即可)
???? 4.将对象的属性存到库中
?? 三、项目例子
???? 1.项目结构图:见附件,项目结构图.png
???? 2. 数据库:MYSQL? 库名:LOG4J? 表名:LogMessage/StudentMessage
???????? 表结构请看附件:LogMessage.png/StudentMessage.png
???? 3.代码及说明
???? log4j.properties :分别输出指定为:控制台、文件(log.log)、数据库
?
log4j.rootLogger=INFO,appender1,appender2,DATABASE # console log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n # file log4j.appender.appender2=org.apache.log4j.FileAppender log4j.appender.appender2.File=log.log log4j.appender.appender2.layout=org.apache.log4j.PatternLayout log4j.appender.appender2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n #mysql dbappender test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.URL=jdbc:mysql://127.0.0.1:3306/LOG4J log4j.appender.DATABASE.username=root log4j.appender.DATABASE.password=root log4j.appender.DATABASE=control.DbAppender log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n %L
??? Conorl包——DbAppender.java :日志提交中转站,提取日志信息,处理后进行数据库操作插入对应的表中
?
package control; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import org.apache.log4j.jdbc.JDBCAppender; import org.apache.log4j.spi.ErrorCode; import org.apache.log4j.spi.LoggingEvent; import bean.HashMapping; import bean.Students; import bean.UserBean; import dao.JdbcUtils; import dao.StudentsUtil; import dao.UserUtil; public class DbAppender extends JDBCAppender { protected void closeConnection(Connection con) { // TODO Auto-generated method stub // super.closeConnection(con); JdbcUtils.close(con); } @Override protected void execute(String sql) throws SQLException { // TODO Auto-generated method stub // super.execute(arg0); int flag = 0; int end = sql.lastIndexOf(")"); String sqls = sql.substring(0, end + 1); String beanname = sql.substring(end + 1); if (beanname.equals("UserBean")) { flag = UserUtil.insertUser(sqls); } else if (beanname.equals("Students")) { flag = StudentsUtil.insertStudent(sqls); } System.out.println(flag == 0 ? "insert fail!" : "insert successful!"); } @Override protected Connection getConnection() throws SQLException { // TODO Auto-generated method stub // return super.getConnection(); if (connection == null) { connection = JdbcUtils.getConnection(); } return connection; } @Override protected String getLogStatement(LoggingEvent event) { // TODO Auto-generated method stub // return super.getLogStatement(event); StringBuffer sbuf = new StringBuffer(); Hashtable hm = (Hashtable) event.getMessage(); String sql = null; if ((hm.get("beanname")).equals("UserBean")) { sbuf.append(UserUtil.insertSql()); sql = sbuf.toString(); int end = sql.lastIndexOf("("); sql = sql.substring(0, end) + "('" + hm.get(HashMapping.USER_TIME) + "','" + event.getMessage() + "','" + hm.ge