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)