JDBC appender 的 Log4j2 MDC 配置
Log4j2 MDC configuration for JDBC appender
我有 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 数据库中吗?
我猜你在每个日志上都推送了数据库?那么你push的时候有可能没有进入本地线程去查找user id值?
您是手动推送到数据库吗?
我找到了解决办法:
user
和 level
是 SQL 保留关键字,将其从 user
更改为 usr
并将 level
更改为 lvl
解决了问题并且现在我在数据库中有了日志。
我有 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 数据库中吗?
我猜你在每个日志上都推送了数据库?那么你push的时候有可能没有进入本地线程去查找user id值?
您是手动推送到数据库吗?
我找到了解决办法:
user
和 level
是 SQL 保留关键字,将其从 user
更改为 usr
并将 level
更改为 lvl
解决了问题并且现在我在数据库中有了日志。