亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何給 Log4j 配上數據庫連接池

2019-11-18 12:37:18
字體:
來源:轉載
供稿:網友

  我們都知道log4j是一個優秀的開源日志記錄項目,我們不僅可以對輸出的日志的格式自定義,還可以自己定義日志輸出的目的地,比如:屏幕,文本文件,數據庫,甚至能通過socket輸出。
  
  現在讓我們對日志輸出到數據庫來進行配置
  
  配置如下:
  
  #---JDBC ---輸出到數據庫
  # JDBCAppender log4j.PRoperties file
  #log4j.rootCategory=WARN,JDBC
  # APPENDER JDBC
  log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender
  log4j.appender.JDBC.driver=com.MySQL.jdbc.Driver
  log4j.appender.JDBC.URL=jdbc:mysql://localhost:3306/test
  log4j.appender.JDBC.user=use
  log4j.appender.JDBC.passWord=password
  log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout
  log4j.appender.JDBC.sql=INSERT INTO LOGGING (log_date, log_level, location, message) VALUES ('%d{ISO8601}', '%-5p', '%C,%L', '%m')
  
  表結構如下:
  
  log_date  varchar2(50)
  log_level varchar2(5)
  location  varchar2(100)
  message  varchar2(1000)
  
  筆者照做,但沒有運行成功,而且此種方法是利用傳統的數據庫連接方法,對于數據庫的治理和效率嚴重不足,在現在這個連接池橫行的時代,為什么我們不能給給Log4j配上連接池,讓Log4j利用數據連接池的連接和數據庫進行通訊?,F查看Log4j的Api,發現JDBCAppender這個類有以下幾段話:WARNING: This version of JDBCAppender is very likely to be completely replaced in the future. Moreoever, it does not log exceptions. The JDBCAppender provides for sending log events to a database.
  
  For use as a base class:
  
  Override getConnection() to pass any connection you want. Typically this is used to enable application wide connection pooling.
  Override closeConnection(Connection con) -- if you override getConnection make sure to implement closeConnection to handle the connection you generated. Typically this would return the connection to the pool it came from.
  Override getLogStatement(LoggingEvent event) to prodUCe specialized or dynamic statements. The default uses the sql option value.
  
  原來log4j建議我們把其提供的JDBCAppender作為基類來使用,然后Override三個父類的方法:getConnection(),closeConnection(Connection con)和getLogStatement(LoggingEvent event)。
  
  原來如此,那就寫一個子類JDBCPoolAppender來替代這個JDBCAppender
  
  JDBCPoolAppender代碼和其相關代碼如下:
  
  JDBCPoolAppender.java:
  
  package common.log;
  import java.sql.Connection;
  import org.apache.log4j.spi.LoggingEvent;
  import java.sql.SQLException;
  import java.sql.Statement;
  import java.util.Iterator;
  import org.apache.log4j.spi.ErrorCode;
  import org.apache.log4j.PatternLayout;
  import common.sql.MyDB;
  import common.sql.GeneralDb;
  
  public class JDBCPoolAppender extends org.apache.log4j.jdbc.JDBCAppender {
  
  private MyDB mydb = null;
  protected String sqlname=""; //增加一個數據庫jndiName的屬性
  
  protected Connection connection = null;
  protected String sqlStatement = "";
  /**
  * size of LoggingEvent buffer before writting to the database.
  * Default is 1.
  */
  protected int bufferSize = 1;
  
  public JDBCPoolAppender() {
  super();
  }
  
  /**
  * ArrayList holding the buffer of Logging Events.
  */
  public void append(LoggingEvent event) {
  buffer.add(event);
  if (buffer.size() >= bufferSize)
  flushBuffer();
  }
  
  /**
  * By default getLogStatement sends the event to the required Layout object.
  * The layout will format the given pattern into a workable SQL string.
  *
  * Overriding this provides direct access to the LoggingEvent
  * when constructing the logging statement.
  *
  */
  protected String getLogStatement(LoggingEvent event) {
  return getLayout().format(event);
  }
  
  /**
  *
  * Override this to provide an alertnate method of getting
  * connections (such as caching). One method to fix this is to open
  * connections at the start of flushBuffer() and close them at the
  * end. I use a connection pool outside of JDBCAppender which is
  * accessed in an override of this method.
  * */
  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);
  }
  
  /**
  * Override this to return the connection to a pool, or to clean up the
  * resource.
  *
  * The default behavior holds a single connection open until the appender
  * is closed (typically when garbage collected).
  */
  protected void closeConnection(Connection con) {
  mydb=null;
  try {
  if (connection != null && !connection.isClosed())
  connection.close();
  } catch (SQLException e) {
  errorHandler.error("Error closing connection", e,
  ErrorCode.GENERIC_FAILURE);
  }
  
  }
  
  /**
  * Override 此函數來利用連接池返回一個Connetion對象
  *
  */
  protected Connection getConnection() throws SQLException {
  try {
  mydb = GeneralDb.getInstance(sqlname);
  connection = mydb.getConnection();
  } catch (Exception e) {
  errorHandler.error("Error opening connection", e, ErrorCode.GENERIC_FAILURE);
  }
  return connection;
  }
  
  /**
  * Closes the appender, flushing the buffer first then closing the default
  * connection if it is open.
  */
  public void close() {
  flushBuffer();
  
  try {
  if (connection != null && !connection.isClosed())
  connection.close();
  } catch (SQLException e) {
  errorHandler.error("Error closing connection", e,
  ErrorCode.GENERIC_FAILURE);
  }
  this.closed = true;
  }
  
  /**
  * loops through the buffer of LoggingEvents, gets a
  * sql string from getLogStatement() and sends it to execute().
  * Errors are sent to the errorHandler.
  *
  * If a statement fails the LoggingEvent stays in the buffer!
  */
  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();
  }
  
  /** closes the appender before disposal */
  public void finalize() {
  close();
  }
  
  /**
  * JDBCAppender requires a layout.
  * */
  public boolean requiresLayout() {
  return true;
  }
  
  /**
  *
  */
  public void setSql(String s) {
  sqlStatement = s;
  if (getLayout() == null) {
  this.setLayout(new PatternLayout(s));
  } else {
  ((PatternLayout) getLayout()).setConversionPattern(s);
  }
  }
  
  /**
  * Returns pre-formated statement eg: insert into LogTable (msg) values ("%m")
  */
  public String getSql() {
  return sqlStatement;
  }
  
  public void setSqlname(String sqlname){

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近日韩中文字幕中文| 久久精品国产亚洲7777| 18久久久久久| 亚洲精品黄网在线观看| 国产亚洲精品日韩| 久久久国产视频91| 国产成人精品一区| 国产精品99久久久久久白浆小说| 日本国产高清不卡| 最近2019中文字幕第三页视频| 久热99视频在线观看| 国内精品中文字幕| 亚洲精品有码在线| 一区二区三区四区在线观看视频| 欧美专区在线观看| 另类天堂视频在线观看| 国产成人免费av| 久久成人在线视频| 国产丝袜精品视频| 在线日韩第一页| 国产999视频| 欧美激情亚洲视频| 欧美香蕉大胸在线视频观看| 日韩欧美在线字幕| 国产亚洲美女精品久久久| 日韩精品免费综合视频在线播放| 国产精品扒开腿爽爽爽视频| 中文字幕精品视频| www.欧美免费| 4438全国亚洲精品在线观看视频| 国产精品大片wwwwww| 欧美猛男性生活免费| 国外色69视频在线观看| 57pao国产精品一区| 国产精品69精品一区二区三区| 日韩精品在线视频观看| 在线日韩日本国产亚洲| 国产精品中文字幕在线| 8x海外华人永久免费日韩内陆视频| 国产精品美乳在线观看| 91视频九色网站| 国产综合在线观看视频| 成人免费观看49www在线观看| 一色桃子一区二区| 国产精品一二三视频| 国产精品国产自产拍高清av水多| 热re99久久精品国产66热| 日本一区二三区好的精华液| 欧美成人午夜激情| 91av在线不卡| 97精品视频在线播放| 2019中文字幕在线免费观看| 日本一区二区三区四区视频| 在线播放精品一区二区三区| 91老司机在线| 黑人巨大精品欧美一区二区免费| 性色av一区二区三区红粉影视| 亚洲3p在线观看| 久青草国产97香蕉在线视频| 亚洲欧美国产制服动漫| 国产一区二区欧美日韩| 国产盗摄xxxx视频xxx69| 亚洲精品美女在线观看| 亚洲欧美日韩天堂| 国产视频精品久久久| 一本一本久久a久久精品牛牛影视| 亚洲精品自拍第一页| 欧美性猛交xxxx黑人猛交| 国产精品入口福利| 高清视频欧美一级| 国产亚洲欧美视频| 国产欧美亚洲视频| 大胆欧美人体视频| 国产精品视频26uuu| 97在线观看免费高清| 久久五月情影视| 日韩一区二区在线视频| 91精品国产一区| 国产深夜精品福利| 97国产真实伦对白精彩视频8| 欧美巨乳美女视频| 日韩成人黄色av| 亚洲少妇激情视频| 亚洲欧美中文字幕在线一区| 在线观看国产欧美| 国产日韩欧美电影在线观看| 久久久综合av| 国产91九色视频| 2019亚洲日韩新视频| 日韩极品精品视频免费观看| 2021久久精品国产99国产精品| 91亚洲永久免费精品| 欧美—级高清免费播放| 国产欧美日韩高清| 精品精品国产国产自在线| 国产精品国产亚洲伊人久久| 日本国产欧美一区二区三区| 97超级碰碰人国产在线观看| 亚洲免费人成在线视频观看| 成人写真视频福利网| 亚洲国内精品在线| 91国内在线视频| 中文字幕亚洲综合久久筱田步美| 亚洲天堂av高清| 成人妇女淫片aaaa视频| 亚洲影视九九影院在线观看| 成人免费大片黄在线播放| 久久久精品一区二区| 高清视频欧美一级| 一区二区三区天堂av| 成人激情av在线| 国模gogo一区二区大胆私拍| 国产亚洲aⅴaaaaaa毛片| 久久国产精品首页| 国产精品精品久久久久久| 国产精品一区二区三区免费视频| 国产一区二区三区三区在线观看| 少妇av一区二区三区| 国产午夜精品美女视频明星a级| 成人在线中文字幕| 欧美日韩午夜剧场| 91亚洲午夜在线| 欧美日韩亚洲一区二| 91久久久久久久久久久| 国内外成人免费激情在线视频| 美女扒开尿口让男人操亚洲视频网站| 久久人人爽人人爽人人片亚洲| 欧美成年人视频网站欧美| 亚洲国产精品人久久电影| 国产精品偷伦视频免费观看国产| 国产成人福利夜色影视| 亚洲国产天堂久久国产91| 深夜福利亚洲导航| 久久夜精品香蕉| 色久欧美在线视频观看| 日韩免费中文字幕| 麻豆乱码国产一区二区三区| 国产性猛交xxxx免费看久久| 欧美日韩激情美女| 欧美巨大黑人极品精男| 久久九九国产精品怡红院| 成人av番号网| 91免费精品国偷自产在线| 性欧美xxxx视频在线观看| 成人av番号网| 久久久久久久一区二区| 国产一区二区三区三区在线观看| 91精品在线影院| 日韩欧美一区视频| 亚洲国产婷婷香蕉久久久久久| 91极品视频在线| 欧美性猛交xxxx乱大交极品| 成人精品在线观看| 91亚洲国产精品| 成人午夜高潮视频| 国产精品一区二区三区毛片淫片| 综合av色偷偷网| 日韩一区二区在线视频| 欧美日本啪啪无遮挡网站| 欧美中文字幕在线观看| 91成人免费观看网站| 日本亚洲欧美成人| 欧美激情精品久久久久久蜜臀| 欧美成人精品在线视频|