Logback и MDC в многопоточной системе

У меня есть многопоточное приложение, в котором каждый поток работает с разными объектами с именами, т.е.:

process-1
process-2
process-3

В настоящее время шаблон выглядит следующим образом:

[%thread] - %msg %n

И я хочу добиться чего-то вроде этого:

[%thread] %processName - %msg %n

Где processName указано в объекте.

Моя цель — добавить эти имена в сгенерированные журналы, чтобы я мог очень легко найти их, когда мне нужно будет просмотреть историю. Я уже записываю название темы, но мне этого мало.

Я начал с MDC, однако оказалось, что он сохраняет сохраненное имя между всеми потоками. В лучшем случае он использует это имя для всех журналов, в худшем — свойство пустое.

Как я могу добиться этого потокобезопасного ведения журнала с MDC или без него?


person Forin    schedule 11.01.2019    source источник
comment
Значения MDC являются локальными для потока, я не знаю, что вы имеете в виду под он сохраняет сохраненное имя между всеми потоками. До Logback 1.1.5 контекст MDC автоматически наследовался дочерними потоками. После версии 1.1.5 контексты MDC больше не наследуются автоматически.   -  person Robert    schedule 11.01.2019
comment
разве недостаточно ввести processName в msg?   -  person nandsito    schedule 11.01.2019
comment
Я думаю, что вы используете пул потоков и не очищаете значения MDC в конце обработки, в результате чего одно и то же значение MDC печатается для двух разных задач. Обратите внимание, что значения MDC хранятся в ThreadLocal переменных. Теперь, поскольку в конце задачи поток возвращается в пул для использования другой задачей, значения MDC остаются.   -  person Saptarshi Basu    schedule 11.01.2019
comment
@nandsito означает отправку идентификатора процесса в качестве аргумента каждому методу.   -  person imperezivan    schedule 11.01.2019
comment
@SaptarshiBasu точно. Итак, мне нужно очистить ThreadLocal, прежде чем поток будет возвращен в пул?   -  person Forin    schedule 14.01.2019


Ответы (1)


Я полагаю, что каждый процесс запускается в другом потоке, поэтому при запуске потока в MDC помещается процесс id

// this method runs in different thread for each invocation.
public void startProcess(String idProcess) {
    MDC.put("processName", idProcess);
     ....

и в вашем логбэке поменяйте шаблон

[%thread] %X{processName} %msg %n

метод put сохраняет идентификатор в потоке, поэтому каждый поток будет иметь другое значение

person imperezivan    schedule 11.01.2019