JDBC附加程序的Log4j2 MDC配置

时间:2019-07-12 14:02:29

标签: java sql-server logging log4j2

我有log4j2.xml文件:

<Console name="Console" target="SYSTEM_OUT">
   <PatternLayout
            pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{userId} %-5level %logger{36}: %msg%n" />
</Console>

其中有一个%X{userId}部分,它允许我显示MDC(线程上下文)中的内容。

我对JDBC具有类似的配置:

<JDBC name="sqlServer" tableName="dbo.application_log">
        <ConnectionFactory
            class="mbms.configuration.Log4j2ConnectionFactory"
            method="getConnection" />
        <Column name="eventDate" isEventTimestamp="true" />
        <Column name="level" pattern="%level" />
        <Column name="logger" pattern="%logger" />
        <Column name="user" pattern="%X{userId}" />
        <Column name="message" pattern="%message" />
        <Column name="exception" pattern="%ex{full}" />
</JDBC>

它不起作用。当我注释掉用户时,日志存储在数据库中,但是当日志出现时,出现异常:

Caused by: java.sql.BatchUpdateException: Incorrect syntax near the keyword 'user'.
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2065)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2544)
at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.commitAndClose(JdbcDatabaseManager.java:532)
... 108 more

您知道我如何使用%X{userId}将此信息存储在MS SQL数据库中吗?

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案: userlevel是SQL保留的关键字,将其从user更改为usr,将level更改为lvl解决了这个问题,现在我已经在数据库中获取了日志。

答案 1 :(得分:0)

我猜您在每次登录时都将数据库推入数据库吗?然后,当您推送时,可能没有进入本地线程来找到用户ID值?

您要手动推送到数据库吗?