You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Brian Yeh (JIRA)" <ji...@apache.org> on 2019/02/26 23:13:00 UTC
[jira] [Created] (LOG4J2-2558) Literal values do not work with
ColumnMapping for JdbcAppender
Brian Yeh created LOG4J2-2558:
---------------------------------
Summary: Literal values do not work with ColumnMapping for JdbcAppender
Key: LOG4J2-2558
URL: https://issues.apache.org/jira/browse/LOG4J2-2558
Project: Log4j 2
Issue Type: Bug
Components: Appenders, JDBC
Affects Versions: 2.11.1
Environment: MacOS High Sierra 10.13.6 Darwin Kernel Version 17.7.0
java.vm.specification.version: 1.8
os.arch: x86_64
Reporter: Brian Yeh
I'm programmatically updating the configuration after it has been created
{code:java}
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
ColumnConfig[] columnConfig = new ColumnConfig[0];
ColumnMapping[] columnMappings = new ColumnMapping[1];
columnMappings[0] = ColumnMapping.newBuilder()
.setLiteral("'TEST_STRING'")
.build();
FactoryMethodConnectionSource myConnectionSource =
FactoryMethodConnectionSource.createConnectionSource(
"com.ConnectionFactory",
"getConnection");
Appender appender = org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.newBuilder()
.setTableName("MSG_LOG")
.setConfiguration(config)
.setColumnMappings(columnMappings)
.setColumnConfigs(columnConfig)
.setConnectionSource(myConnectionSource)
.withName("db-appender")
.build();
appender.start();
config.addAppender(appender);
Map<String, LoggerConfig> loggers = config.getLoggers();
loggers.forEach((loggerName, loggerConfig) -> {
loggerConfig.addAppender(appender, org.apache.logging.log4j.Level.INFO, null);
config.addLogger("org.apache.logging.log4j", loggerConfig);
});
ctx.updateLoggers();
{code}
Creates JdbcDatabaseManager with sqlStatement
{code:java}
INSERT INTO MSG_LOG (null) VALUES ('TEST_STRING'?)
{code}
As you can see, PARAMETER_MARKER "?" gets added.
Later in writeInternal method, there is a check for layout without an else condition
{code:java}
if (layout != null) //line 164 of JdbcDatabaseManager
{code}
Layout is null for my column so the parameter never get's set for the PreparedStatement which will throw an error
{code:java}
Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 1
at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2086)
at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:9713)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.addBatch(OraclePreparedStatementWrapper.java:1067)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.addBatch(HikariProxyPreparedStatement.java)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeInternal(JdbcDatabaseManager.java:199)
... 65 more
{code}
So, we could create the sqlStatement without the ParameterMarker "?" or perhaps just make sure it gets set to null.
I would be open to making a PR if this is an issue and other can reproduce.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)