JDBC appender 的 Log4j2 MDC 配置

我有 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 数据库存储这些信息吗?


米脂
浏览 153回答 2
2回答

慕田峪7331174

我找到了一个解决方案:&nbsp;user并且level是 SQL 保留关键字,将它从userto更改usr为level解决lvl了这个问题,现在我在数据库中有了日志。

慕工程0101907

我猜你在每个日志上都推送了数据库?那么当您推送时,它可能不会进入本地线程来查找用户 ID 值?你是手动推送到数据库吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java