Добавить переменные MDC в JsonLayout - log4j2

Как добавить переменные MDC в журнал json, созданный JsonLayout из log4j2. Я использовал тег KeyValuePair для добавления таких свойств, как имя хоста, в журнал, но я не нашел способа добавить в него переменные MDC. В макете шаблона я использовал% X {traceId}, но я уверен, что JsonLayout не может проанализировать эти символы преобразования (насколько я знаю, символы преобразования используются только в макете шаблона). Я вошел в исходный код JsonLayout, но не нашел функции, которая фактически помещает все данные в сообщение журнала.

Спасибо.


person omjego    schedule 21.09.2018    source источник


Ответы (1)


Вам нужен поиск по log4j2. Похоже, вас особенно интересует Поиск в контекстной карте как вы упомянули MDC (который, кстати, теперь называется ThreadContext в log4j2).

Вот простой пример:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class ThreadContextExample {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        ThreadContext.put("myKey", "myValue");
        log.info("Here's a message!");
    }
}

Вот конфигурация log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <JsonLayout compact="false" eventEol="false" stacktraceAsString="true">
                <KeyValuePair key="myJsonKey" value="${ctx:myKey}"/>
            </JsonLayout>
        </Console>

    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

и, наконец, некоторый образец вывода (сокращенный для удобства чтения):

{
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "example.ThreadContextExample",
  "message" : "Here's a message!",
  ...
  "myJsonKey" : "myValue"
}
person D.B.    schedule 22.09.2018
comment
Но есть одна проблема. Не все сообщения журнала должны содержать MyJsonKey. Итак, в этом случае журнал печатается, а поле значения оказывается {ctx: mykey}, что выглядит очень плохо. Есть ли способ динамически добавлять параметры в журнал json? @ Д. - person omjego; 11.10.2018
comment
Если вы вообще не хотите, чтобы ключ печатался в журнале, вы, вероятно, захотите посмотреть RoutingAppender и используйте две разные конфигурации приложения в Routes - одну с ключом, другую без. Также прочтите страницу часто задаваемых вопросов по log4j2, есть хороший пример RoutingAppender там. - person D.B.; 11.10.2018