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