转发自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. iOS之UILabel自适应高度、宽度

    下列两条自适应高度和宽度的自定义方法:

  2. font-family 字体

    宋体 SimSun黑体 SimHei微软雅黑 Microsoft YaHei微软正黑体 Microsoft JhengHei新宋体 NSimSun新细明体 PMingLiU细明体 MingLiU标楷体 ...

  3. Appium移动自动化测试之获取appPackage和appActivity

    方法一:直接打开Appium,点击左上角机器人图标 选择apk所在位置,如图所示,这里以ContactManager.apk为例 方法二:利用dex2jar和jd-gui这两个工具反编译apk文件 这 ...

  4. Android 7.0 UICC 分析(四)

    本文讲解SIMRecords /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.jav ...

  5. Android 7.0 UICC 分析(二)

    本文讲解UiccCard类 /frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccCard.java U ...

  6. OpenSource.organization-in-github

    1. gosquared https://github.com/gosquared 2. slack https://github.com/slackhq 3. The New York Times ...

  7. 第九章 springboot + mybatis + 多数据源 (AOP实现)(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5415896.html 1.ShopDao package com.xxx.firstboot.dao; imp ...

  8. C++中下标操作注意事项

    C++中,下标操作不添加元素,对于任何使用下标操作的情况,如string类型.vector类型等等,必须是已存在的元素才能用下标操作符进行索引.如果类型为空,通过 下标操作进行赋值时,不会添加任何元素 ...

  9. [转]caffe的配置过程

    caffe的配置过程 转:http://blog.csdn.net/brightming/article/details/51106629   版权声明:本文为博主原创文章,欢迎转载!转载请写明原文链 ...

  10. savepic

    #-*-coding:utf-8-*-from lxml import etreeimport requestsfrom urllib import urlretrieveimport osdef g ...