使用jdbc来保存log4j日志信息的一个例子
package log4jtest;import org.apache.log4j.*;
import org.apache.log4j.jdbc.JDBCAppender;
import java.sql.*;
import org.apache.log4j.spi.*;
import org.apache.log4j.PatternLayout;
/**
* <p>Title: </p>
* <p>Description: 使用jdbc来保存log4j日志信息。
* The JDBCAppender provides for sending log events to a database. </p>
* <p>
* * 在数据库创建数据表,运行程序迁,先创建下面的数据库对象
--Create sequence
create sequence SEQ_wdzlog;
-- Create table
create table WDZLOG
(
WDZLOGID NUMBER(10) not null,
LogName VARCHAR2(255),
LogLevel VARCHAR2(20),
MSG VARCHAR2(255)
);alter table WDZLOG
add constraint PK_WDZLOGID primary key (WDZLOGID);* </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: netsky</p>
* @author wdz( hotmail [email protected])
* @version 1.0
*/
public class WdzJdbcLogTest1 {
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
stmt.execute();
}
catch (SQLException e) {
if (stmt != null)
stmt.close();
throw e;
}
stmt.close();
closeConnection(con);
}/***保存日志事件
* **/
protected String getLogStatement(LoggingEvent event) {
e = event;
return getLayout().format(event);
}
}public WdzJdbcLogTest1() {
logger = Logger.getLogger(WdzJdbcLogTest1.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");
logger.warn("warn info");
logger.error("error info");
logger.fatal("fatal info");}
private void testJDBCAppender() {
jdbcAppender = new WdzJDBCAppender();
//下面的参数可以自己修改满足自己的要求
//设置 日志数据库保存使用的参数,可以采用配置文件的方式来加载信息
jdbcAppender.setDriver("oracle.jdbc.driver.OracleDriver");
jdbcAppender.setURL("jdbc:oracle:thin:@wdz:1521:wdzdb");
jdbcAppender.setUser("apple");
jdbcAppender.setPassword("apple");
jdbcAppender.setSql("insert into WDZLOG values (SEQ_WDZLOG.nextval,?,?,?)");
//测试使用数据库保存日志信息
writeLogInfo();
jdbcAppender.close();
}public static void main(String[] args) {
WdzJdbcLogTest1 wdzTest11 = new WdzJdbcLogTest1();
}
}

解决方案 »

  1.   

    还是不行,我把参数放在配置文件中
    log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.database.BufferSize=40
    log4j.appender.database.Driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
    log4j.appender.database.Threshold=error
    log4j.appender.database.URL=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test
    log4fj.appender.database.User=sa
    log4j.fappender.database.password=
    log4j.appender.database.sql=INSERT INTO logtest (message) VALUES (?)
    log4j.appender.database.layout=org.apache.log4j.PatternLayout
    log4j.appender.database.layout.ConversionPattern=[framework] %d %-4r [%t] %-5p %c %x - %m%n
      

  2.   

    单步调试后发现没有执行execute()方法,为什么?