2014-06-16 35 views
1

我已經創建了一個JDBC appender並綁定了ColumnConfig和DataSourceConnectionSource。log4j2 JDBC Appender問題:無法插入記錄

試圖插入記錄在數據庫(Logger.debug(「測試」))。我得到下面的異常。

感謝

[6/16/14 18:44:58:647 GMT-08:00] 00000024 SystemErr  R ERROR StatusLogger An exception occurred processing Appender JDBCAppender org.apache.logging.log4j.core.appender.AppenderLoggingException: Failed to insert record for log event in JDBC manager: DSRA1300E: Feature is not implemented: PreparedStatement.setNString 
    at org.apache.logging.log4j.core.appender.db.jdbc.JDBCDatabaseManager.writeInternal(JDBCDatabaseManager.java:117) 
    at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:159) 
    at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:103) 
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:97) 
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:425) 
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406) 
    at org.apache.logging.log4j.core.Logger$PrivateConfig.logEvent(Logger.java:275) 
    at org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:289) 
    at org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:99) 
    at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:43) 
    at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:28) 
    at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919) 
    at java.lang.Thread.run(Thread.java:736) 
Caused by: java.sql.SQLFeatureNotSupportedException: DSRA1300E: Feature is not implemented: PreparedStatement.setNString 
    at com.ibm.ws.rsadapter.AdapterUtil.notSupportedX(AdapterUtil.java:1306) 
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setNString(WSJdbcPreparedStatement.java:2362) 
    at org.apache.logging.log4j.core.appender.db.jdbc.JDBCDatabaseManager.writeInternal(JDBCDatabaseManager.java:104) 
    ... 14 more 
Caused by: java.lang.AbstractMethodError: java/sql/PreparedStatement.setNString(ILjava/lang/String;)V 
    at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setNString(WSJdbcPreparedStatement.java:2346) 
    ... 15 more 

回答

4

我以前的答案是不正確的,道歉。 可以修改此行爲by configuration。默認情況下,所有列(除isEventTimestamp="true"之外)均被視爲unicode字符串,並通過PreparedStatement.setNString方法插入值。如果使用isUnicode="false"配置列,則值應通過PreparedStatement.setString插入,這應該可以工作。示例列配置:

<Appenders> 
    <JDBC name="databaseAppender" tableName="dbo.application_log"> 
     <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" /> 
     <Column name="eventDate" isEventTimestamp="true" /> 
     <Column name="level" pattern="%level" isUnicode="false" /> 
     <Column name="logger" pattern="%logger" isUnicode="false" /> 
     <Column name="message" pattern="%message" isUnicode="false" /> 
     <Column name="exception" pattern="%ex{full}" isUnicode="false" /> 
    </JDBC> 
    </Appenders> 
+0

即使我懷疑是相同的...我曾嘗試使用ojdbc6 11.2.0.2和ojdbc14驅動程序版本,但沒有運氣。 –

+0

我以爲這是一個驅動程序的問題,但看着文檔和代碼,我意識到我錯了。我修改了我的答案。 –

+0

配置更改是否解決了問題? –