转发自http://www.cnblogs.com/adolfmc/p/3432720.html

Log4j 配置数据库连接池(将日志信息保存到数据库)

org.apache.log4j.jdbc.JDBCAppender 是利用传统的 JDBC 连接方法,这种方式连接数据库效率低下,为了解决这个问题,现在自定义一个 Log4j 的 Appender, 将数据库连接改为连接池的形式,此 Appender 继承自 org.apache.log4j.jdbc.JDBCAppender, 并运用了开源项目Poolman(可从http://nchc.dl.sourceforge.net/project/poolman/PoolMan/poolman-2.1-b1/poolman-2.1-b1.zip 下载)数据库连接池的包。

org.apache.log4j.jdbc.JDBCAppender 的官方 API(http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/jdbc/JDBCAppender.html) 中有这么一段话:

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.

Each append call adds to an ArrayList buffer. When the buffer is filled each log event is placed in a sql statement (configurable) and executed. BufferSize , db URL , User , & Password are configurable options in the standard log4j ways.

The setSql(String sql) sets the SQL statement to be used for logging -- this statement is sent to aPatternLayout (either created automaticly by the appender or added by the user). Therefore by default all the conversion patterns in PatternLayout can be used inside of the statement. (see the test cases for examples)

Overriding the getLogStatement(org.apache.log4j.spi.LoggingEvent)method allows more explicit control of the statement used for logging.

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 implementcloseConnection 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.

大概意思就是建议我们把其提供的 org.apache.log4j.jdbc.JDBCAppender 作为基类来使用,然后 Override 这三个方法: getConnection()、 closeConnection(Connection con) 和 getLogStatement(LoggingEvent event)。

下面是我写的一个 org.apache.log4j.jdbc.JDBCAppender 的子类:

  1. package com.hmw.log4j;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import org.apache.log4j.spi.ErrorCode;
  5. import com.codestudio.sql.PoolMan;
  6. /**
  7. * Log4j的 Appender, 通过连接池获取数据库连接
  8. * @author Carl He
  9. */
  10. public class MyJDBCAppender extends org.apache.log4j.jdbc.JDBCAppender {
  11. /**通过 PoolMan 获取数据库连接对象的 jndiName 属性*/
  12. protected String jndiName;
  13. /**数据库连接对象*/
  14. protected Connection connection;
  15. public MyJDBCAppender() {
  16. super();
  17. }
  18. @Override
  19. protected void closeConnection(Connection con) {
  20. try {
  21. if (connection != null && !connection.isClosed())
  22. connection.close();
  23. } catch (SQLException e) {
  24. errorHandler.error("Error closing connection", e, ErrorCode.GENERIC_FAILURE);
  25. }
  26. }
  27. @Override
  28. protected Connection getConnection() throws SQLException {
  29. try {
  30. //通过 PoolMan 获取数据库连接对象(http://nchc.dl.sourceforge.net/project/poolman/PoolMan/poolman-2.1-b1/poolman-2.1-b1.zip)
  31. Class.forName("com.codestudio.sql.PoolMan");
  32. connection= PoolMan.connect("jdbc:poolman://" + getJndiName());
  33. } catch (Exception e) {
  34. System.out.println(e.getMessage());
  35. }
  36. return connection;
  37. }
  38. /**
  39. * @return the jndiName
  40. */
  41. public String getJndiName() {
  42. return jndiName;
  43. }
  44. /**
  45. * @param jndiName the jndiName to set
  46. */
  47. public void setJndiName(String jndiName) {
  48. this.jndiName = jndiName;
  49. }
  50. }

log4j.properties 文件中加上如下一段代码(对此 Appender 的配置):

  1. log4j.appender.JDBC=com.hmw.log4j.MyJDBCAppender
  2. log4j.appender.JDBC.jndiName=log
  3. log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.JDBC.sql=INSERT INTO LOGGING (log_date, log_level, location, message) VALUES ('%d{ISO8601}', '%-5p', '%C,%L', '%m')

最后不要忘了 PoolMan 的配置文件 poolman.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <poolman>
  3. <management-mode>local</management-mode>
  4. <datasource>
  5. <dbname>log</dbname>
  6. <jndiName>log</jndiName>
  7. <driver>com.mysql.jdbc.Driver</driver>
  8. <url>jdbc:mysql://localhost:3306/test</url>
  9. <username>use</username>
  10. <password>password</password>
  11. <minimumSize>0</minimumSize>
  12. <maximumSize>10</maximumSize>
  13. <logFile>logs/mysql.log</logFile>
  14. </datasource>
  15. </poolman>

log4j写入数据库的更多相关文章

  1. Log4j写入数据库详解

    log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...

  2. log4j日志写入数据库

    # log4j写入数据库 ### 前言-----------------------------log4j是写入日志到控制台和文件很常见,但是写入到数据库不多见.做性能测试写入到数据库,统计方便些. ...

  3. (OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库

    参考: How to configure Log4j in JDev 11g Ever wanted to use log4j in your adf project ? Well though Or ...

  4. 使用log4j将日志写入数据库并发送邮件

    参考: 快速了解Log4J 1.log4j的初始配置 参考该问的配置即可完整的实现写入数据库及发送邮件的功能 a.写入数据库需要配置相应的jar包,数据库类型不同,请使用指定的数据库配置,该文仅限于o ...

  5. Log4j(一):Log4j将日志信息写入数据库

    前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ...

  6. 使用log4j让日志写入数据库

    之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记 ...

  7. 怎样借助log4j把日志写入数据库中

            log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...

  8. logback日志写入数据库(mysql)配置

    如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding ...

  9. Excel 导入到Datatable 中,再使用常规方法写入数据库

    首先呢?要看你的电脑的office版本,我的是office 2013 .为了使用oledb程序,需要安装一个引擎.名字为AccessDatabaseEngine.exe.这里不过多介绍了哦.它的数据库 ...

随机推荐

  1. SOCKS 5协议详解(转)

    笔者在实际学习中,由于在有些软件用到了socks5(如oicq,icq等),对其原理不甚了解,相信很多朋友对其也不是很了解,于是仔细研读了一下rfc1928,觉得有必要译出来供大家参考. 1.介绍: ...

  2. Linux基础-常用命令

    常用的压缩命令 一.tar 1.压缩:tar zcvf [压缩包名].tar.gz [待压缩的文件名 ... ] 2.解压缩:tar zxvf [压缩包名].tar.gz -C [指定的解压目录] 3 ...

  3. ELK:kibana使用的lucene查询语法【转载】

    kibana在ELK阵营中用来查询展示数据 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使 ...

  4. docker--buildbot安装

    curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname - ...

  5. Velocity语言的介绍

    Velocity语言的介绍 2016-09-06 15:39:25 语言介绍 Velocity是一种Java模版引擎技术,是一个基于Java的模板引擎(template engine).她允许任何人简 ...

  6. 反射,System.Type类

    http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到 ...

  7. zTree树的模糊搜索

    工作需要,所以做了一个比较方便的搜索功能:1.功能实现都是基于zTree的API:2.如有更好的建议,欢迎拍我:其中要说明下的是flag 这个字段, 这是我自己定义的扩展字段,代码中涉及到flag 请 ...

  8. 移动端开发库zepto 之我思

    1.zepto tap事件的点透事件. 比如有一个bug.那天我大概至少花了一个钟头来找这个错误. 点击一个按钮,出来一个弹框.弹框我这里引入的是boostrap的js组件里的modal组件. 结果我 ...

  9. 用Navicat_SSH 连接数据库服务器

    SSH设置(只限于Mysql.oracle.PostgreSQL及 SQL Server 并只支持 SSH2通讯协定) Secure SHell(SSH)是一个通过网络登录其他计算机的程序,在远程服务 ...

  10. 中国能用的NTP服务器地址

    133.100.11.8 prefer210.72.145.44203.117.180.36131.107.1.10time.asia.apple.com64.236.96.53130.149.17. ...