论坛首页 综合技术论坛

用log4j把日志异步写入数据库中

浏览 8284 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-15  
在src文件夹下面创建一个log4j.properties 文件,用来设置数据库的连接。

log4j.logger.my_work=INFO,db
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=10
log4j.appender.db.URL=jdbc:mysql:///test 
log4j.appender.db.driver=com.mysql.jdbc.Driver
log4j.appender.db.user=linken
log4j.appender.db.password=linken
log4j.appender.db.sql=[color=red]INSERT INTO MY_LOG (RECORDE_DATE,WHICHE_CLASS,WHICH_METHOD,I_DO) VALUES('%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')[/color]
log4j.appender.db.layout=org.apache.log4j.PatternLayout


一般来说BufferSize的值设置为10,利用log4j的缓存机制批量写入到数据库中,对系统没什么影响。

在方法的应用:
Log myDBLog = LogFactory.getLog("my_work");
   发表时间:2008-03-19  
BufferSize没什么作用,JDBCAppender

只是把用户输出的log现在一个ArrayList中保存,当其数量达到了BufferSize,才启动写日志。而且JDBCAppender还是每次都生成Connection,每一个Log还是单独写入,不是批量写入。

Log4J的数据库写入方式就是一个鸡肋,如果需要提高性能,首先,自己需要实现一个连接池。而且其还不支持addBatch,赫赫,如下是log4j源代码(JDBCAppender.java)
########################
  public void flushBuffer() {
    //Do the actual logging
    removes.ensureCapacity(buffer.size());
    for (Iterator i = buffer.iterator(); i.hasNext();) {
      try {
        LoggingEvent logEvent = (LoggingEvent)i.next();
    String sql = getLogStatement(logEvent);
    execute(sql);
        removes.add(logEvent);
      }
      catch (SQLException e) {
    errorHandler.error("Failed to excute sql", e,
   ErrorCode.FLUSH_FAILURE);
      }
    }
   
    // remove from the buffer any events that were reported
    buffer.removeAll(removes);
   
    // clear the buffer of reported events
    removes.clear();
  }
###########################

  protected void execute(String sql) throws SQLException {

    Connection con = null;
    Statement stmt = null;

    try {
        con = getConnection();

        stmt = con.createStatement();
        stmt.executeUpdate(sql);
    } catch (SQLException e) {
       if (stmt != null)
     stmt.close();
       throw e;
    }
    stmt.close();
    closeConnection(con);

    //System.out.println("Execute: " + sql);
  }
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics