代码如下**   
 * 参数化消息   
 * @author Johnson.Lee   
 *   
 */   
public interface ParameterizedMessage extends Serializable {    
   
    /**   
     * 获取参数列表   
     * @return 返回参数列表   
     */   
    public Object[] getParameters();    
        
    /**   
     * 获取指定索引位置的参数   
     * @param index 索引位置   
     * @return 返回参数列表中指定索引位置的参数值   
     * @throws IndexOutOfBoundsException 当index >= 参数列表个数时,抛出此异常   
     * @see #getParameterCount()   
     */   
    public Object getParameter(int index) throws IndexOutOfBoundsException;    
        
    /**   
     * 获取参数个数   
     * @return 返回参数个数   
     */   
    public int getParameterCount();    
        
}  Java代码 
/**   
 * JDBC日志消息   
 * @author Johnson.Lee   
 *   
 */   
public class JDBCLogMessage implements ParameterizedMessage {    
    private static final long serialVersionUID = 1709063421963292637L;    
    private Object[] params;    
        
    public JDBCLogMessage(Object... params) {    
        this.params = params;    
    }    
   
    public Object[] getParameters() {    
        return this.params;    
    }    
   
    public Object getParameter(int index) throws IndexOutOfBoundsException {    
        return this.params[index];    
    }    
   
    public int getParameterCount() {    
        return this.params.length;    
    }    
   
    @Override   
    public String toString() {    
        return Arrays.toString(this.params);    
    }    
}  
2.继承Log4j的AppenderSkeleton Java代码  
/**   
 * 使用纯JDBC连接将日志记录到数据库中   
 * @author Johnson.Lee   
 *   
 */   
public class JDBCAppender extends AppenderSkeleton {    
    private String driver;    
    private String url;    
    private String userName;    
    private String password;    
    private String sql;    
   
    @Override   
    protected void append(LoggingEvent e) {    
        Connection conn = null;    
        PreparedStatement pstmt = null;    
        try {    
            Class.forName(this.driver);    
            conn = DriverManager.getConnection(this.url, this.userName, this.password);    
            if (e.getMessage() instanceof ParameterizedMessage) {    
                try {    
                    pstmt = conn.prepareStatement(sql);    
                    Object[] params = ((ParameterizedMessage) e.getMessage()).getParameters();    
                    for (int i = 0; i < params.length; i++) {    
                        pstmt.setObject(i + 1, params);    
                    }    
                    pstmt.executeUpdate();    
                } catch (SQLException ex) {    
                    this.errorHandler.error("log into database failed!", ex, 0);    
                } finally {    
                    AbstractJDBCDao.close(pstmt);    
                    AbstractJDBCDao.close(conn);    
                }    
            }    
        } catch (ClassNotFoundException ex) {    
            this.errorHandler.error("load jdbc driver [" + this.driver + "] failed!", ex, 0);    
        } catch (SQLException ex) {    
            this.errorHandler.error("establish connect failed!", ex, 0);    
        }    
    }    
        
    @Override   
    public void close() {    
    }    
   
    @Override   
    public boolean requiresLayout() {    
        return false;    
    }    
   
    /**   
     * 设置JDBC驱动   
     * @param driver JDBC驱动类名   
     */   
    public void setDriver(String driver) {    
        this.driver = driver;    
    }    
   
    /**   
     * 设置连接字符串   
     * @param url 数据库连接字符串   
     */   
    public void setUrl(String url) {    
        this.url = url;    
    }    
   
    /**   
     * 设置数据库用户名   
     * @param userName 用户名   
     */   
    public void setUserName(String userName) {    
        this.userName = userName;    
    }    
   
    /**   
     * 设置数据库密码   
     * @param password 密码   
     */   
    public void setPassword(String password) {    
        this.password = password;    
    }    
   
    /**   
     * 设置插入日志的SQL语句   
     * @param sql   
     */   
    public void setSql(String sql) {    
        this.sql = sql;    
    }    
        
}  
[/pre]
3.配置log4j.properties Java代码 
log4j.rootLogger=INFO, stdout, jdbc    
   
#std appender    
log4j.appender.stdout=org.apache.log4j.ConsoleAppender    
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout    
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n    
   
#file appender    
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender    
#log4j.appender.file.File=${application.context}    
#log4j.appender.file.DatePattern='_'yyyyMMdd'.log'   
#log4j.appender.file.layout=org.apache.log4j.PatternLayout    
#log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n    
   
#jdbc appender    
log4j.appender.jdbc=net.kinginfo.framework.log.JDBCAppender    
log4j.appender.jdbc.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver    
log4j.appender.jdbc.url=jdbc:microsoft:sqlserver://192.172.10.106:1433;databaseName=tempdb    
log4j.appender.jdbc.userName=sa    
log4j.appender.jdbc.password=sa    
log4j.appender.jdbc.sql=insert into LogInfo(time, type, info) values(getDate(),?,?)  4.创建日志表 Sql代码 
use tempdb;    
   
create table LogInfo (    
    id int identity(1,1) primary key not null,    
    time datetime,    
    type int,    
    info varchar(255)    
);    
   
select * from LogInfo; 5.编写测试类 Java代码 
public class TestJDBCAppender {    
        
    public static void main(String[] args) {    
        Logger logger = Logger.getRootLogger();    
        ParameterizedMessage msg = new JDBCLogMessage(1, "日志测试");    
        logger.info(msg);    
    }    
}  
问题如下
log4j:ERROR load jdbc driver [oracle.jdbc.driver.OracleDriver  ] failed!
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver  
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at JDBCAppender.append(JDBCAppender.java:27)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.info(Category.java:666)
at TestJDBCAppender.main(TestJDBCAppender.java:8)

jar文件都加了

解决方案 »

  1.   

    我没用过log4j 信息写入数据库中 就是它加载数据库驱动时报错
      

  2.   

    找不到驱动 OracleDriver 
    是不是没有添加相应的jar包
    建议你可以在程序里导入 oracle.jdbc.driver.OracleDriver 类,看是否编译错误,可以得知jar包是否引进
      

  3.   

     Class.forName(this.driver); 
     这的问题 如果我把它换成Class.forName(“oracle.jdbc.driver.OracleDriver”); 
    就可以的 但是调试跟踪Class.forName(this.driver); 这也可以读到驱动信息啊 就是找不到