Добавьте переменные MDC в JsonLayout - log4j2 - PullRequest
0 голосов
/ 21 сентября 2018

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

Спасибо.

1 Ответ

0 голосов
/ 22 сентября 2018

То, что вы ищете, это log4j2 lookup .Похоже, вы особенно заинтересованы в Context Map Lookup , как вы упомянули 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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...