Регистрация имени пользователя в log4j - PullRequest
0 голосов
/ 18 декабря 2011

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

1 Ответ

1 голос
/ 18 декабря 2011

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

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

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

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

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

...