[
https://issues.apache.org/jira/browse/LOG4J2-2667?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16901112#comment-16901112
]
Ralph Goers edited comment on LOG4J2-2667 at 8/7/19 2:55 AM:
-------------------------------------------------------------
[~epmchui],
You CANNOT use {{type="java.sql.Types.TIMESTAMP"}}, you MUST use a fully
qualified class name like {{java.sql.Timestamp}}. If you turn on Log4j's status
DEBUG logging, you can verify this:
{noformat}
<configuration packages="**.***.****.cmmp.audit.logger" status="DEBUG">
...
</configuration>
{noformat}
Yields:
{noformat}
2019-08-06 10:30:28,004 main WARN Error while converting string
[java.sql.Types.TIMESTAMP] to type [class java.lang.Class]. Using default value
[null]. java.lang.ClassNotFoundException: java.sql.Types.TIMESTAMP
at
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at
org.apache.logging.log4j.util.LoaderUtil.loadClass(LoaderUtil.java:168)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters$ClassConverter.convert(TypeConverters.java:200)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters$ClassConverter.convert(TypeConverters.java:1)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.convert(TypeConverters.java:419)
at
org.apache.logging.log4j.core.config.plugins.visitors.AbstractPluginVisitor.convert(AbstractPluginVisitor.java:151)
at
org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor.visit(PluginBuilderAttributeVisitor.java:50)
at
org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.injectFields(PluginBuilder.java:185)
at
org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:121)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)
at
org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:579)
at
org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:651)
at
org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:668)
at
org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:1)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:155)
at
org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:45)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:48)
at
org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:1)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at apache.log4j2.issue.App.<clinit>(App.java:15)
{noformat}
It is likely (I've not looked a git logs) that the more recent version of Log4j
calls {{PreparedStatement#clearParameters()}} in a spot where it did not in the
past in order to release resources as soon as we are done with them.
was (Author: garydgregory):
[~epmchui],
You CANNOT use {{type="java.sql.Types.TIMESTAMP"}}, you MUST use a fully
qualified class name like {{java.sql.Timestamp}}. If you turn on Log4j's status
DEBUG logging, you can verify this:
{noformat}
<configuration packages="hk.gov.ogcio.cmmp.audit.logger" status="DEBUG">
...
</configuration>
{noformat}
Yields:
{noformat}
2019-08-06 10:30:28,004 main WARN Error while converting string
[java.sql.Types.TIMESTAMP] to type [class java.lang.Class]. Using default value
[null]. java.lang.ClassNotFoundException: java.sql.Types.TIMESTAMP
at
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at
org.apache.logging.log4j.util.LoaderUtil.loadClass(LoaderUtil.java:168)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters$ClassConverter.convert(TypeConverters.java:200)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters$ClassConverter.convert(TypeConverters.java:1)
at
org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.convert(TypeConverters.java:419)
at
org.apache.logging.log4j.core.config.plugins.visitors.AbstractPluginVisitor.convert(AbstractPluginVisitor.java:151)
at
org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor.visit(PluginBuilderAttributeVisitor.java:50)
at
org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.injectFields(PluginBuilder.java:185)
at
org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:121)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
at
org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)
at
org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:579)
at
org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:651)
at
org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:668)
at
org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)
at
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:1)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:155)
at
org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:45)
at
org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:48)
at
org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:1)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at apache.log4j2.issue.App.<clinit>(App.java:15)
{noformat}
It is likely (I've not looked a git logs) that the more recent version of Log4j
calls {{PreparedStatement#clearParameters()}} in a spot where it did not in the
past in order to release resources as soon as we are done with them.
> "Values not bound to statement" when using JDBC appender, appender does not
> respect bufferSize="0".
> ---------------------------------------------------------------------------------------------------
>
> Key: LOG4J2-2667
> URL: https://issues.apache.org/jira/browse/LOG4J2-2667
> Project: Log4j 2
> Issue Type: Bug
> Components: Appenders, Core
> Affects Versions: 2.11.2, 2.12.0
> Environment: Oracle Java 11.0.3, Windows Server 2016, Spring Boot
> 2.1.6
> Reporter: Edith Chui
> Assignee: Gary Gregory
> Priority: Major
> Fix For: 3.0.0, 2.12.1
>
> Attachments: log4j2.issue.zip
>
>
>
> Since version 2.11.2, the log4j2 library was unable to log message on
> database via JDBC connection. When using 2.11.1, no such problem was found.
> root cause:
> In org.sqlite.core.CorePreparedStatement, below function was called, but
> paramValid local variable is not initialized. Value of
> "paramValid.cardinality()" is always 0 which does not match with the total
> number of parameter.
>
> {code:java}
> protected void checkParameters() throws SQLException
> {
> if (paramValid.cardinality() != paramCount)
> throw new SQLException("Values not bound to statement");
> }
> {code}
>
> Sample appender in log4j2.xml
> {code:java}
> <JDBC name="jdbcAppender" tableName="LOG_TABLE" bufferSize="0">
> <ConnectionFactory class="MY.SQLiteConnectionFactory"
> method="getDatabaseConnection" />
> <ColumnMapping name="FIELD1" type="java.lang.Integer" pattern="%X{FIELD1}"
> />
> <ColumnMapping name="FIELD2" type="java.lang.String" pattern="%X{FIELD2}" />
> <ColumnMapping name="FIELD3" type="java.lang.String" pattern="%X{FIELD3}" />
> <ColumnMapping name="FIELD4" type="java.sql.Types.TIMESTAMP"
> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" />
> </JDBC>{code}
>
> {panel:title=Exception Log}
> 2019-08-02 15:57:45,483 main ERROR An exception occurred processing Appender
> jdbcAppender
> org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException: Failed
> to commit transaction logging event or flushing buffer.
> at
> org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:552)
> at
> org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeThrough(JdbcDatabaseManager.java:867)
> at
> org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:264)
> at
> org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:110)
> at
> org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
> at
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:464)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:448)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:431)
> at
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406)
> at
> org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
> at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
> at
> org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2170)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2125)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2108)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2007)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1866)
> at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:179)
> ...
> Caused by: java.sql.SQLException: Values not bound to statement
> at
> org.sqlite.core.CorePreparedStatement.checkParameters(CorePreparedStatement.java:71)
> at
> org.sqlite.core.CorePreparedStatement.executeBatch(CorePreparedStatement.java:83)
> at
> org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:545)
> ...
> {panel}
--
This message was sent by Atlassian JIRA
(v7.6.14#76016)