Значение log4j MDC по умолчанию

Кто-нибудь знает, как указать значение по умолчанию для отсутствующей записи в MDC, используя XML-файл конфигурации log4j? У меня есть приложение, определенное в моем файле 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 или какое-либо другое сигнальное значение, когда сообщения журнала получены в контекстах, которые не будут иметь идентификатора заказа.


person Mark W    schedule 25.04.2014    source источник


Ответы (2)


Если вы получаете доступ к объекту MDC в своем коде Java, вы можете инициализировать значение для orderId, добавив следующее в какую-либо область запуска (например, метод сервлета init()):

import org.apache.log4j.MDC;

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

Изменить: вполне вероятно, что вам нужно будет устанавливать это значение по умолчанию каждый раз, когда вы пишете сообщение журнала, не имеющее значения orderId, и после каждого MDC.remove(). АОП кажется здесь вариантом.

person DwB    schedule 25.04.2014
comment
Спасибо за это. Хотя это не решит мою проблему, поиграв с ней, я узнал немного больше о MDC, поэтому +1. - person Mark W; 25.04.2014

Также вы можете определить значение по умолчанию в шаблоне макета, например %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)" 
        />
person Aarish Ramesh    schedule 10.04.2017