2011-12-18 4 views
0

Мне нужно распечатать имя пользователя и клиентский IP-адрес в logs.but. Имя пользователя - это только печать для первого потока с использованием MDC в log4j. Из следующего потока значения печатаются как пустые. может ли кто-нибудь предложить, как продолжить дальше.Регистрация имени пользователя в log4j

+0

1-Как вы решаете следующую тему? если это следующий запрос, он должен пройти через код, в который вы помещаете значения в MDC. и убедитесь, что вы удаляете значения из MDC только после завершения запроса/потока. –

ответ

1

MDC использует ThreadLocal для хранения значений. Возможно, Log4J (например, Logback) использует InheritableThreadLocal, который частично решает такие проблемы, как ваш: вновь созданный поток наследует MDC от родительского потока.

Я предполагаю, что вы используете какой-то пул (мы редко создаем выделенные потоки в среде EE, поэтому наследование MDC не только не помогает, но может вызвать много путаницы, когда пул растет по требованию). К сожалению, в этом случае вам нужно установить MDC явно при переключении на новый поток. Еще более важно, вам нужно очистить после него, иначе поток пула будет «загрязнен» старым MDC.

Например, при отправке сообщения JMS из веб-потока, содержащего допустимое значение MDC, необходимо добавить требуемые значения MDC, например. в заголовки сообщений. Затем, когда вы получите сообщение JMS (в JMS потоке), вам нужно retrive эти значения вручную и зарегистрировать их:

public void onMessage(Message message) { 
    MDC.put("user", message.getStringProperty("user")); 
    try { 
     //handle the message 
    } finally { 
     MDC.clear(); 
    } 
} 

Вы должны выполнить аналогично регистрации каждый раз, когда ваш запрос прыгает в другой поток. Еще раз - очистка очень важное.

Смежные вопросы