列映射的log4j2 patternlayout不起作用 [英] log4j2 patternlayout for columnmapping not working

查看:517
本文介绍了列映射的log4j2 patternlayout不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对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不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆