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