Есть ли недостатки в вызове MDC.clear() в начале обработки, а не в конце?

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

Итак, мой вопрос: есть ли какие-либо недостатки в том, как я это делаю? очистка контекста всегда, как правило, в начале обработки и в конце.

Чтобы было ясно, если бы я писал код с нуля, я бы сделал что-то вроде:

MDC.put();
try {
...
} finally {
  MDC.clear();
}

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


person crabe    schedule 10.02.2017    source источник


Ответы (2)


Рекомендуется быть осторожным в этом. Если вы ссылаетесь на начало приложения, это не имеет смысла, и MDC в то время ничего не было бы. Я предполагаю, что ваша ссылка находится в начале запроса, но в этом случае, если вы это сделаете, могут быть другие запросы, обрабатываемые параллельно, и очистка MDC повлияет на регистрацию всех других запросов. Вы можете вызывать MDC.remove() в конце каждого запроса. Не зная вашего точного приложения, это все, что я могу предложить.

person Pavan Kumar    schedule 10.02.2017
comment
Хорошо, немного больше контекста, я работаю над приложениями промежуточного программного обеспечения, поэтому обработка запросов от машины к машине. Так что в моем случае ВСЕ значения в контексте имеют значение только для времени жизни этого конкретного запроса, поэтому я вызываю MDC.clear() в начале обработки следующего запроса. - person crabe; 10.02.2017
comment
MDC поможет, если ваше приложение создано с использованием модели совместного использования потоков. Если он использует что-то вроде Netty, где один цикл обработки событий обрабатывает все запросы, это поможет. Для большинства других веб-приложений я обнаружил, что печати только номера потока достаточно для идентификации запросов. - person Pavan Kumar; 10.02.2017

Единственная разница в MDC.clear и MDC.remove заключается в следующем: при очистке будут удалены все записи из ThreadContextMap (сохранение MDC для каждого потока), удаление удалит только один ключ из ThreadContextMap, если он существует.

Но поскольку вы упомянули «из библиотеки, в которой нет MDC»,

Пожалуйста, поставьте этот чек:

if (MDC.getMDCAdapter() != null) MDC.clear();

and if (MDC.getMDCAdapter() != null) MDC.put();
person Shashank Gupta    schedule 15.02.2019