package com.yss.log4j;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.LoggingEvent;
/**
* 利用log4j.jar将日志写人到数据库中
*
* @author qinglong
*
*/
public class JdbcAppendTest {
private Logger logger;
private JDBCAppender jdbcAppender;
/***********************************************************************************************
* 自己定义的日志保存类
**********************************************************************************************/
class WdzJDBCAppender extends JDBCAppender {
private LoggingEvent e;
/**
* 可以修改这个方法,实现PreparedStatement,Connection得重用
*
* 第三进入
*/
protected void execute(String sql) throws SQLException {
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection();
stmt = con.prepareStatement(this.getSql());
stmt.setString(1, e.getLoggerName());// LogName
stmt.setString(2, e.getLevel().toString());// LogLevel
stmt.setString(3, (String) e.getMessage());// MSG
System.out.println(e.getLoggerName() + " ," + e.getNDC() + ", "
+ e.getRenderedMessage() + " ," + e.getThreadName()
+ " " + new Date(e.getStartTime()) + ", " + e.getClass() + ", "
+ e.getLocationInformation().getClassName() + " ,"+e.getMessage()+" ,"+e.getThrowableStrRep());
stmt.execute();
} catch (SQLException e) {
if (stmt != null)
stmt.close();
throw e;
}
stmt.close();
closeConnection(con);
}
/*******************************************************************************************
* *保存日志事件 第二进入
******************************************************************************************/
protected String getLogStatement(LoggingEvent event) {
e = event;
System.out.println("getLogStatement方法");
return getLayout().format(event);
}
}
//第一步进入 1
public JdbcAppendTest() {
logger = Logger.getLogger(JdbcAppendTest.class.getName());
// 测试,使用jdbc来保存日志信息
testJDBCAppender();
}
/***********************************************************************************************
* 写信息到日志中去
**********************************************************************************************/
private void writeLogInfo() {
logger.addAppender(jdbcAppender);
logger.setLevel(Level.ALL);
logger.debug("aaa debug info");
// logger.debug("aaa debug info.aaa");
logger.info("bbb info");
System.out.println("writeLogInfo方法");
logger.warn("warn info");
logger.error("error info");
logger.fatal("fatal info");
}
private void testJDBCAppender() {
jdbcAppender = new WdzJDBCAppender();
// 下面的参数可以自己修改满足自己的要求
// 设置 日志数据库保存使用的参数,可以采用配置文件的方式来加载信息
jdbcAppender.setDriver("com.mysql.jdbc.Driver");
jdbcAppender.setURL("jdbc:mysql://localhost:3306/test");
jdbcAppender.setUser("root");
jdbcAppender.setPassword("root");
jdbcAppender
.setSql("insert into log(loggername,level,message) values (?,?,?)");
//数据库中的字段 loggername、level、message
// 测试使用数据库保存日志信息
writeLogInfo();
jdbcAppender.close();
}
public static void main(String[] args) {
JdbcAppendTest wdzTest11 = new JdbcAppendTest();
}
}