Dyanmical заполнение переменной в файле журнала - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть веб-служба (Jenkins), которая обрабатывает пользовательские запросы, и я хочу иметь возможность динамически добавлять идентификатор сеанса запроса в каждую строку журнала, не добавляя эту переменную в каждое действие журнала.

Я использую log4j2 с реализацией slf4j, я инициализирую регистратор, используя внешний файл конфигурации с org.apache.logging.log4j.core.config.Configurator, я создаю экземпляр регистратора для каждого сеанса, используя

final Logger logger = LoggerFactory.getLogger(MyClass.class);

У меня есть, например:

logger.debug("received new request");
...
logger.debug("added something");

И я хочу, чтобы идентификатор сеанса пользователя добавлялся в каждую строку без необходимости добавлять его сам, например:

logger.debug("{} received new request",session.getId());
...
logger.debug("{} added something",session.getId());

Мой log4j2.xmlфайл:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="INFO">
    <Properties>
        <Property name="logPath">...</Property>
        <Property name="rollingFileName">...</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.project" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="rollingFile"/>
       </Logger>
    </Loggers>
</Configuration>

Фактические результаты из текущего файла журнала:

[[36mDEBUG[m] 2019-02-05 16:42:09,794 SpellCheck.getResult() - start
[[36mDEBUG[m] 2019-02-05 16:42:10,420 SpellCheck.getResult() - Spelling correction returned no results.
[[36mDEBUG[m] 2019-02-05 16:42:10,420 SpellCheck.getResult() - end

Чего я хочу достичь:

[[36mDEBUG[m] 2019-02-05 16:42:09,794 SpellCheck.getResult() - 1234 - start
[[36mDEBUG[m] 2019-02-05 16:42:10,420 SpellCheck.getResult() - 1234 - Spelling correction returned no results.
[[36mDEBUG[m] 2019-02-05 16:42:10,420 SpellCheck.getResult() - 1234 - end

Где 1234, например, сеансid.

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Я понял, это было намного проще, чем я думал.

В основном добавил% X {userSessionId} в строку

<PatternLayout pattern= ... /> 

в log4j2.xml.И в коде добавлено

HttpSession session = request.getSession();
org.apache.logging.log4j.ThreadContext.put("userSessionId", session.getId());
...