列映射的log4j2 patternlayout不起作用

时间:2018-07-10 10:37:29

标签: java log4j2

我对JDBC附加程序的log4j2配置有问题。 我有一个很好的示例,具有简单的驱动程序管理器连接,可以进行快速测试。

//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));

在Java代码中,我这样做:

<ColumnMapping name="user_id" />

一切正常,将地图条目保存到DB中的匹配列。但是,然后,我尝试另一种配置,更改

<ColumnMapping name="user_id" pattern="%K{user_id}"/>

pattern="%d{UNIX_MILLIS}"
据我从文档(JDBCAppenderPatternLayout docs)理解,

的工作原理类似-通过大括号之间指定的键获取MapMessage的值。但是这种类型的配置似乎不起作用,因为在数据库中,我在“ user_id”列中仅收到空字符串。我在配置上打开了跟踪模式,并在日志中看到,在准备sql语句JDBCAppender时,实际上将空字符串作为“ user_id”列的值。但是我摔断了头,试图理解原因。特别要考虑的是,最初用CURSOR配置的“ date_time”列映射接收正确的时间戳记值。

2 个答案:

答案 0 :(得分:0)

自己找到解决方案。当我开始使用MapMessage的特定实现时,所有功能都按预期开始工作,例如:

StringMapMessage map = new StringMapMessage();
map.put("user_id", "...");
//...here go other map fields
map.put("response_xml", "...");
//log the map message with logger to DB
dbLogger.debug(map);

答案 1 :(得分:0)

在您的xml配置文件中,写为:

OutOfMemoryException

<ColumnMapping name="db_column1" pattern="${msg1}"/>

在您的Java代码中,写为:

<ColumnMapping name="db_column1" pattern="%K{msg1}"/>

应该没事的。