Использование log4j2, как регистрировать пары ключ-значение

#java #logging #log4j #log4j2

#java #ведение журнала #log4j #log4j2

Вопрос:

Мне нужно создавать журналы с парами ключ-значение, как показано ниже. Есть ли какая-либо поддержка в PatternLayout для этого для статических полей в потоке, таких как log_level, class_name, event_id и т. Д. С log4j2.xml .

Пример журнала:

2014-06-18 11:57:46,719 log_level= «INFO» имя_лога= «com.abc.dgl.App: main(158)» имя = «Событие запуска приложения» event_id =»b88f7ea0-4cb1-438f-a728-ac7c2bdac578″ приложение = «Тестовое приложение» серьезность = «информация» действие =»загружено для обработки файла sfor» desc =»реквизит был прочитан и загружен» результат = «успех» причина = «abc» transaction_id =»b88f7ea0-4cb1-438f-a728-ac7c2bdac578″

Ответ №1:

Да, это возможно.

Вы можете либо использовать MapMessage, который поддерживается map (или K ) шаблоном преобразования PatternLayout: примером шаблона компоновки может быть "%-5p [%t]: %m %map%n" .

Регистрация MapMessage выглядит следующим образом: Map<String,String> myMap = getMyMap(); Logger.debug(new MapMessage(myMap));

Другой способ сделать это — использовать карту ThreadContext . Это поддерживается mdc (или X ) шаблоном преобразования PatternLayout . Пример шаблона: "%-5p [%t]: %m %mdc%n" . Обычно используется ввод идентификатора пользователя в контекстную карту потока при входе пользователя в систему и отображение этого идентификатора пользователя во всех сообщениях журнала, отправляемых этим потоком, до тех пор, пока пользователь не выйдет из системы.

Вместо регистрации всей карты вы также можете регистрировать только определенные ключи, указав ключ в шаблоне компоновки: например "%-5p [%t]: %m %mdc{userID}%n" .

Комментарии:

1. Огромное спасибо. Я использовал комбинацию ThreadContext, map и Pattern для решения фиксированной и динамической части журналов. Я хочу, чтобы журналы передавались в Splunk, а splunk любит пары ключ / значение.

2. Макет шаблона:(%L)’%m %n»/>

3. ThreadContext: ThreadContext.put(«event_id», UUID.randomUUID().toString()); ThreadContext.put(«transaction_id», UUID.randomUUID().toString()); ThreadContext.put(«app_name», «splunk sample app»);

4. Map<Строка, строка> myMap = new HashMap<Строка, строка>(); myMap.put(«card_token», «abcdefg»); myMap.put(«действие», «запуск примера приложения»); myMap.put(«desc», «начало выборки splunkприложение»); logger.error(новое MapMessage(myMap));

5. myMap.clear(); myMap.put(«действие», «внутри цикла»); myMap.put(«desc», «внутри цикла образца приложения»); myMap.put(«loop_count», String.valueOf(i)); logger.error(новое MapMessage(myMap));