问题描述
我对JDBC附加程序的log4j2配置有问题.我有一个很好的示例,具有简单的驱动程序管理器连接,可以进行快速测试.
I have a problem with log4j2 configuration of JDBC appender.I have very well working example with simple driver manager connection for quick tests.
<JDBC name="DBLogger" tableName="db_logs" ignoreExceptions="false">
<DriverManager
connectionString="jdbc:mysql://localhost:3306/twib"
userName="****"
password="****"
driverClassName="com.mysql.jdbc.Driver"
/>
<ColumnMapping name="date_time" pattern="%d{UNIX_MILLIS}" />
<ColumnMapping name="user_id" />
<ColumnMapping name="session_id" />
<ColumnMapping name="user_ip" />
<ColumnMapping name="user_agent" />
<ColumnMapping name="device_info" />
<ColumnMapping name="device_id" />
<ColumnMapping name="device_mac" />
<ColumnMapping name="device_imei" />
<ColumnMapping name="device_imsi" />
<ColumnMapping name="request_name" />
<ColumnMapping name="request_xml" />
<ColumnMapping name="response_xml" />
<MessageLayout />
</JDBC>
从Java代码中,我可以执行以下操作:
From java code I do something like that:
//get logger instance
Logger dbLogger = LogManager.getLogger("DBLogger");
//create map for map message
HashMap map = new HashMap();
//fill in map with values
map.put("user_id", "...");
//...here go other map fields
map.put("response_xml", "...");
//log the map message with logger to DB
dbLogger.debug(new MapMessage(map));
一切正常,将地图条目保存到DB中的匹配列.但是,然后,我尝试另一种配置,更改
Everything works fine, map entries are saved to matching columns in DB. But then, I try another configuration, changing
<ColumnMapping name="user_id" />
到
<ColumnMapping name="user_id" pattern="%K{user_id}"/>
我从文档中了解到了
( JDBCAppender , PatternLayout文档)的工作原理相似-需要大括号之间指定的Key的MapMessage值.但是这种类型的配置似乎不起作用,因为在数据库中,我在"user_id"列中仅收到空字符串.我在配置上打开了跟踪模式,并在日志中看到,在准备sql语句JDBCAppender时,实际上将空字符串作为"user_id"列的值.但是我摔断了头,试图理解原因.尤其要考虑的是,最初用pattern="%d{UNIX_MILLIS}"
配置的"date_time"列映射接收正确的时间戳记值.
which as I understood from the docs (JDBCAppender, PatternLayout docs) works similar - takes value of MapMessage by key, specified between braces. But this type of configuring looks like not working, because in DB I receive only empty strings in "user_id" column. I turned on trace mode on configuration, and see in logs that when preparing sql statement JDBCAppender really puts empty string as value for "user_id" column. But I broke my head, trying to understand why. Especially considering, that "date_time" column mapping, which was at first configured with pattern="%d{UNIX_MILLIS}"
, receives correct timestamp value.
推荐答案
在您的xml配置文件中,写为:
in your xml configuration file, write as:
<ColumnMapping name="db_column1" pattern="${msg1}"/>
或
<ColumnMapping name="db_column1" pattern="%K{msg1}"/>
在您的Java代码中,写为:
in your java code, write as:
StringMapMessage map = new StringMapMessage();
map.put("msg1", "db column value");
logger.debug(map);
应该没事的.
这篇关于列映射的log4j2 patternlayout不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!