2017-01-17 2 views
1

В моем приложении, которое работает в десятках тысяч строк кода, я вижу, что люди регистрируют уникальный идентификатор (например, идентификатор запроса) с каждым оператором журнала. Учитывая многопоточность и многочисленные запросы, поступающие в ящик, я вижу, почему регистрация этого идентификатора запроса один раз в начале не работает. По мере того, как может возникнуть другой запрос, и журналы будут перемешаны.Как избежать повторяющегося ведения журнала уникального идентификатора с помощью log4j2

Есть ли какой-нибудь более простой способ сделать это с помощью log4j2.

+0

Как вы генерируете уникальный 'ID'? – fabfas

+0

Caller передает его на службу. – Andy897

ответ

1

Это распространенная проблема, так как у Log4j2 вы можете использовать карту ThreadContext, чтобы решить эту проблему.

Когда запрос поступает код, установить уникальный идентификатор в ThreadContext:

ThreadContext.put("id", uniqueID()); 

С этого момента, все протоколирование, что происходит в том же потоке будет иметь карту с «ид» в качестве ключа и значение, указанное вами. Вы можете использовать это для filtering, routing, и вы можете сделать карту отображаемой в файле журнала с шаблоном беседы %X. Если вам нужен только определенный ключ (например, «id»), используйте %X{id} в своем pattern layout.

Когда вы закончите, снимите ключ с ThreadContext.remove("id").

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

+0

Привет Ремко. Это неправильное место для этого запроса, но можете ли вы посмотреть http://stackoverflow.com/questions/41746157/log4j2-setting-printobject-to-true-in-custom-appender .. когда вы получите шанс. – Andy897

+0

Хорошо, но супер занят. Дай мне немного времени. –

0

Посмотрите на сопоставленный дигностический контекст (MDC). Это в основном ThreadLocal, который добавляется ко всем сообщениям, зарегистрированным одним и тем же потоком. Вы должны включить его в шаблон. Также не забудьте очистить MDC.

В веб-приложениях это обычно делается с помощью фильтра.

+0

Для Log4J 2 посмотрите [здесь] (https://logging.apache.org/log4j/2.x/manual/thread-context.html). –