Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Log4j jdbc appender for DB2 in Tomcat 8

I'm trying to use Log4j 2 to save the logs generated from a web application into a table in a DB2 10.5 database. As a servlet container i'm using Tomcat 8.
My data source declaration, inside Tomcat's 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"/>

The appender declared insinde 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>

The jdbc resource is also declared in my application's web.xml file. While i've managed to insert the logs on a MySQL database (changing of course the required information in my configuration files), i'm not able to achieve the same in DB2. The following stack trace part is what seems to be causing the problem:

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

I can't seem to find any information regarding this error and i really can explain to myself what's going wrong. I'd be very grateful for your help.
What i'm using: Eclipse Luna, Tomcat 8, DB2 10.5, db2jcc.jar , jdk1.7, log4j required jars.

like image 539
Endrik Avatar asked Mar 17 '23 14:03

Endrik


1 Answers

This: Caused by: java.lang.AbstractMethodError: com.ibm.db2.jcc.am.po.setNString basically says that the DB2 driver does not implement the method setNString(), which Log4j is trying to use at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeInternal(JdbcDatabaseManager.java:110).

Now, what to do about it I can't tell. May be there is a parameter that can instruct Log4j to use setString() instead, or may be, Log4j being open source, you could edit the JdbcDatabaseManager class.

like image 142
mustaccio Avatar answered Mar 27 '23 16:03

mustaccio