Значение по умолчанию log4j MDC
Кто-нибудь знает, как указать значение по умолчанию для отсутствующей записи в MDC, используя log4j config xml? У меня есть appender, определенный в моем XML-файле следующим образом:
<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}). Я искал вокруг и нашел только дубликаты одного и того же потока, которые говорили что-то вроде $${orderID:-DefaultValue}, но это не работает в этом контексте. Мне нужно иметь возможность установить значение по умолчанию 0 или -1 или какое-либо другое часовое значение при получении сообщений журнала в контекстах, которые не имеют идентификатора заказа
2 ответа
Если вы получаете доступ к объекту MDC в своем Java-коде, вы можете инициализировать значение для orderId, добавив следующее в некоторую область запуска (например, метод сервлета init()):
import org.apache.log4j.MDC;
public void blammyStartupMethod()
{
MDC.put("orderId", "sentinal value");
}
Редактировать: Кажется вероятным, что вам нужно будет установить это значение по умолчанию каждый раз, когда вы пишете сообщение журнала, которое не имеет значения orderId, и после каждого MDC.remove(). АОП, кажется, вариант здесь.
Также вы можете определить значение по умолчанию в шаблоне макета, например,%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)"
/>