有没有人知道如何使用log4j的config 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的订单ID(%X {orderID})。我四处搜索,只发现同一个线程的副本说了一些类似于$$ {orderID:-DefaultValue}的内容,但这在这个上下文中不起作用。我需要能够在没有订单ID的上下文中收到日志消息时将值默认为0或-1或其他一些sentinal值
答案 0 :(得分:3)
如果在java代码中访问MDC对象,可以通过在某些启动区域中添加以下内容来初始化orderId的值(例如,servlet init()方法):
import org.apache.log4j.MDC;
public void blammyStartupMethod()
{
MDC.put("orderId", "sentinal value");
}
编辑:每次编写没有orderId值的日志消息时以及每个MDC.remove()之后,您可能需要设置此默认值。 AOP似乎是一个选择。
答案 1 :(得分:-1)
您还可以在布局模式中定义默认值,例如%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)"
/>