日期:2014-05-16  浏览次数:20790 次

log4j+JDBC+mySQL 将对象写入数据库

??? 一、写前唠叨

????? 最近写了一个关于将对象通过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