7

有谁知道如何使用 log4j 的配置 xml 为 MDC 中缺少的条目指定默认值?我在我的 XML 文件中定义了一个 appender,如下所示:

<appender name="DBAppender" class="org.apache.log4j.jdbc.JDBCAppender"> 
    <param name="URL" value="jdbc:sqlserver://phenom\\MSSQLSERVER_2012\;databaseName=pickmax_express" /> 
    <param name="Driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
    <param name="User" value="user" /> 
    <param name="Password" value="password" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
        <param name="ConversionPattern" 
          value="INSERT INTO LOG (source, message, order_id, log_level) VALUES ( 'TESTSOURCE','%m', %X{orderID}, 0)" 
        /> 
    </layout> 
</appender> 

有问题的部分是来自 MDC (%X{orderID}) 的订单 ID。我四处搜索,只发现同一个线程的重复项说的是 $${orderID:-DefaultValue},但这在这种情况下不起作用。当在没有订单 ID 的上下文中收到日志消息时,我需要能够将值默认为 0 或 -1 或其他一些标记值

4

2 回答 2

3

如果您在 java 代码中访问 MDC 对象,您可以通过在某些启动区域添加以下内容来初始化 orderId 的值(例如,servlet init() 方法):

import org.apache.log4j.MDC;

public void blammyStartupMethod()
{
    MDC.put("orderId", "sentinal value");
}

编辑:您似乎需要在每次编写没有 orderId 值的日志消息时以及在每个 MDC.remove() 之后设置此默认值。AOP 在这里似乎是一种选择。

于 2014-04-25T18:03:19.010 回答
0

您也可以在布局模式中定义默认值,例如 %X{orderID:-Def value}

<param name="ConversionPattern" 
          value="INSERT INTO LOG (source, message, order_id, log_level) VALUES ( 'TESTSOURCE','%m', %X{orderID:-Def value}, 0)" 
        />
于 2017-04-10T13:31:17.330 回答