【问题标题】:Logging with log4j in a mysql database using connection pool使用连接池在 mysql 数据库中使用 log4j 进行日志记录
【发布时间】:2012-04-13 00:49:36
【问题描述】:

我已经从 JDBC 实现了一个连接池,以获取和关闭我的数据访问对象的连接,以便使用 java 从 mysql 数据库中存储和检索数据。

我还想通过名为 JDBCAppender 的附加程序将主要操作和异常存储在一个名为 log4j 的库中。

在使用连接池之前,事件的日志记录很好,因为一次只有一个连接被用于操作。现在连接同时从池中被抓取并交还给池,一旦一个连接(第一个)被关闭,记录器似乎不知道如何获得另一个连接。

如何登录到有连接池的数据库?

我自己对此进行了调查,我需要做的就是覆盖 JDBCAppender.java(位于 apache log4j 1.2.16 库中)中的 getConnection() 方法......但我有两个问题。

我需要在 LOG4J 1.2.16 jar 文件中有我的连接池实现类吗? 假设我从池中获得连接,如何将 LOG4J 1.2.16 Java 文件重新编译成 jar 文件?

根据您目前所阅读的内容,我可以提供我的连接池实现和 JDBCAppender java 类,我们可以从那里获取它...

【问题讨论】:

  • @duffymo,我为大写锁定表示歉意,我不是故意的,先生。我正在努力,这就是我寻求帮助的原因,我知道我很亲密,我正在努力让一些东西发挥作用:S ...
  • 请参考此链接 [logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/jdbc/… 以查看解决此问题的建议...谢谢
  • 关于链接,您是说您尝试了该链接并未能获得预期的结果?
  • @贝克斯。如果有负赏金模式,我会给这个问题-50。请处理 duffymo 的反馈。首先,我编辑了问题。
  • @duffymo 感谢您的反馈,先生。我也感谢@Flukey 和@Jayan 的建议...@duffymo,我已经尝试过该链接但没有得到想要的结果先生,我只在数据库中获取使用一个连接的操作的日志(只有第一个连接)其余的日志记录不会发生......我知道我需要覆盖 log4j 库的 JDBCAppender java 类的 getConnection() 方法才能从我的连接池中获取连接,但我不知道是否我需要在新的 log4j 中包含 Apache dbcp 的类(我用于我的池)。

标签: java mysql jdbc log4j connection-pooling


【解决方案1】:

首先,回答您的具体问题:您的连接池类不需要在 Log4J JAR 中。当你运行你的代码时,你所需要的只是在你的CLASSPATH 中拥有所有的类和JAR 文件。 CLASSPATH 将接收所有内容。所以这不是你的问题的原因。

我无法从您的问题与后来的一些 cmet 中判断您是使用自己的连接池还是第 3 方连接池。如果是前者,您绝对应该切换到第 3 方池,例如 DBCPC3P0BoneCP。如果是后者,那么您的问题可能是由您配置池的方式引起的。它绝对与JARs 无关,它们都在您的CLASSPATH 中,不需要组合或混合或类似的东西。

我阅读了javadoc for JDBCAppender 并注意到了一些事情。首先,确保您覆盖closeConnection(),而不仅仅是openConnection()。接下来,我注意到一个警告,这个类将来可能会更改,并且也不会记录异常。

因此,您可能还想使用LogBack 而不是 Log4J。它出自同一作者,代表了较新的技术。它的DBAppender 似乎支持记录异常,并且还允许您插入您的Connection 源,而不是覆盖getConnection()

【讨论】:

  • 感谢您的澄清,先生。我正在使用 Apache DBCP 的连接池实现。 JDBCAppender 的 javadoc 建议使用 JDBCAppender.java 作为我实现从池中租用的连接的基类。这是否意味着我需要创建另一个类来扩展 JDBCAppender 但调用 MyConnPool.getConnection() 和 MyConnPool.close() 而不是 JDCBAppender 的 getConnection() 和 close()?在 log4j-1.2.16.jar\org\apache\log4j\jdbc 中的 log4j 1.2.16.jar 我看到一个 JDBCAppender.class,我需要重新编译吗? ..
  • JDBCAppender 写成 with the intention that users subclass it。您不需要重新编译 Log4J JAR。只需使用您描述的 getConnection()closeConnection() 方法创建 JDBCAppender 的子类,然后在 log4j 配置中指定该新类作为附加程序。我还找到了this document about configuring JDBCAppender;其中的所有内容也应该适用于您的子类。
  • 您说的有道理先生,但我不明白配置文件将如何“理解”新的附加程序。我的 DBCP 连接池实现是 ConnectionProvider。我的 log4j.properties 是log4j.properties。我的问题是,带有连接池类的 getConnection() 和 closeConnection() 的“说”NewJDBCAppender.java 将如何工作? ...我应该在 log4j.properties 文件中更改什么以便新的 JDBCAppender 工作? ...谢谢您,先生...
  • the link I sent you before describing how to configure Log4J。更改这一行:log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender,用新的 JDBCAppender 子类的完全限定类名替换那里的 org.apache.log4j.jdbc.JDBCAppender 值。
  • 亲爱的 sparc_spread,...您能否告诉我您对我的 NewJDBCAppender 中覆盖的 getConnection() 方法有何看法? ...如果你觉得这很好,我应该只把它放在源代码中吗? ...我应该将“log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender”更改为“log4j.appender.DB=com.ConnectionManager.ConnectionProvider”吗? ...请让我知道您对此有何看法...
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多