java - Tomcat 8 中 DB2 的 Log4j jdbc appender

标签 java tomcat jdbc db2 log4j2

我正在尝试使用 Log4j 2 将 Web 应用程序生成的日志保存到 DB2 10.5 数据库的表中。作为 servlet 容器,我使用的是 Tomcat 8。
我的数据源声明,在 Tomcat 的 context.xml 中:

  <Resource 
          type="javax.sql.DataSource"
          name="jdbc/NCRDS" 
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
          driverClassName="com.ibm.db2.jcc.DB2Driver"
          url="jdbc:db2://192.168.1.58:50000/NCR" 
          username="admin"
          password="admin"
          initialSize="0"
          maxActive="80" 
          maxIdle = "30" 
          minIdle="20"
          timeBetweenEvictionRunsMillis="30000"
          minEvictableIdleTimeMillis="60000"
          testOnBorrow="true"
          validationQuery="VALUES 1" 
          validationInterval="30000" 
          removeAbandoned="true"
          removeAbandonedTimeout="60" 
          logAbandoned="true" 
          abandonWhenPercentageFull="60"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"/>

appender 在 log4j2.xml 中声明:

 <JDBC name="databaseAppender" tableName="admin.logs">
<DataSource jndiName="java:/comp/env/jdbc/NCRDS" />
<Column name="evendDate" isEventTimestamp="true" />
<Column name="Level" pattern="%level" />
<Column name="Logger" pattern="%logger" />
<Column name="Message" pattern="%msg" />
</JDBC>

jdbc 资源也在我的应用程序的 web.xml 文件中声明。虽然我设法将日志插入 MySQL 数据库(当然是更改我的配置文件中的所需信息),但我无法在 DB2 中实现相同的目的。以下堆栈跟踪部分似乎是导致问题的原因:

Caused by: java.lang.AbstractMethodError: com.ibm.db2.jcc.am.po.setNString(ILjava/lang/String;)V
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:233)
    at com.sun.proxy.$Proxy40.setNString(Unknown Source)
    at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeInternal(JdbcDatabaseManager.java:110)
    at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:167)
    at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:105)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:99)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:430)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:409)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:367)
    at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:112)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:738)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:708)
    at org.apache.logging.log4j.spi.AbstractLogger.debug(AbstractLogger.java:237)
    at com.ikubinfo.fileservice.FileSystemFileManager.<init>(FileSystemFileManager.java:53)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    ... 24 more

我似乎无法找到有关此错误的任何信息,我真的可以向自己解释出了什么问题。我将非常感谢你的帮助。
我正在使用的是:Eclipse Luna、Tomcat 8、DB2 10.5、db2jcc.jar、jdk1.7、log4j 所需的 jar

最佳答案

This: Caused by: java.lang.AbstractMethodError: com.ibm.db2.jcc.am.po.setNString 基本上说 DB2 驱动程序没有实现方法 setNString( ),Log4j 正在尝试使用 at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeInternal(JdbcDatabaseManager.java:110)

现在,我不知道该怎么办。可能有一个参数可以指示 Log4j 使用 setString() 代替,或者可能是,Log4j 是开源的,您可以编辑 JdbcDatabaseManager 类。

关于java - Tomcat 8 中 DB2 的 Log4j jdbc appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508336/

相关文章:

java - 在 AWS Lambda 中使用自定义类时出现 JSON 解析错误

jakarta-ee - 部署 Java Web 应用程序时出现问题

java - Tomcat热部署,JDBC驱动注销失败

java - 我可以动态更改 org.apache.tomcat.jdbc.pool.DataSource 的 maxActive 属性吗?

java - 使用Java与控制台(Linux中的终端)窗口交互

java - 如何知道我的 HTTP 请求是否使用 UTF-8?

java - Cookie 值中存在无效字符 [59]

Tomcat 7 和虚拟主机

java - 仅获取有关特定列的元数据信息,而不循环遍历所有列......这可能吗?

java - 如何在 JPA2 中强制使用 @ManyToOne 字段?