log4j2 не ведет журнал, как ожидалось от junit для переменной MD C - PullRequest
0 голосов
/ 28 мая 2020

Мой файл log4j2. xml перенаправляет на 1 из 2 консольных приложений. Если установлена ​​переменная MD C (ThreadContext), она отправит go приложению, которое выводит переменную. Если нет, он отправит go приложению, которое не пытается его вывести (потому что он не был установлен в MD C). Но строки журнала, которые я получаю в результате в junit, не выводят переменную, что означает, что переменная не найдена в MD C? Я запутался, потому что мои вызовы журнала заменяют переменную myKey при обычном запуске кода с помощью операторов logger.error. Как я могу исправить это в тесте junit, чтобы выбрать правильный маршрут и для модульного теста?

Вот код в моем тесте junit (всего 4 строки кода в методе @Test) org. apache .logging.log4j.Logger logger = org. apache .logging.log4j.LogManager.getLogger ("com.mypackage"); logger.error («Вы НЕ должны видеть здесь myKey»); // и вы его не видите

MDC.put("myKey", "myKey");
logger.error("Now you SHOULD see myKey in here");   // but you get the exact same log line

Вот результат, который мы получаем из приведенного выше кода (2 одинаковые строки)

{"thread":"main","level":"ERROR","loggerName":"com.mypackage","message":"You should NOT see processId in here","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","instant":{"epochSecond":1590697430,"nanoOfSecond":549000000},"threadId":1,"threadPriority":5,"@timestamp":"2020-05-28T16:23:50.549-0400"}
{"thread":"main","level":"ERROR","loggerName":"com.mypackage","message":"Now you SHOULD see processId in here","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","instant":{"epochSecond":1590697459,"nanoOfSecond":214000000},"threadId":1,"threadPriority":5,"@timestamp":"2020-05-28T16:24:19.214-0400"}

А вот log4j2. xml файл. Обратите внимание на строку в сценарии приложения маршрутизации if (myKey == '$ {ctx: myKey}') - это означает, что переменная myKey не была заменена, что опять же работает в моем обычном коде.

    <Appenders>

        <Console name="consoleWithMyKey" target="SYSTEM_OUT">
            <JsonLayout complete="false" compact="true" eventEol="true" >
                <KeyValuePair key="@timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}"/>
                <KeyValuePair key="myKey" value="${ctx:myKey}"/>
            </JsonLayout>
        </Console>

        <Console name="consoleWithoutMyKey" target="SYSTEM_OUT">
            <JsonLayout complete="false" compact="true" eventEol="true" >
                <KeyValuePair key="@timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}"/>
            </JsonLayout>
            <OrchLogFilter/>
        </Console>

        <Routing name="routing">
            <Script name="RoutingInit" language="JavaScript">
                <![CDATA[
                var myKey="${ctx:myKey}";
                if(myKey=='${ctx:myKey}')
                    "consoleWithoutMyKey";
                else
                    "consoleWithMyKey";
                ]]>
            </Script>
            <Routes>
                <Route key="consoleWithoutMyKey" ref="consoleWithoutMyKey"/>
                <Route key="consoleWithMyKey" ref="consoleWithMyKey"/>
          </Routes>
        </Routing>

    </Appenders>

    <Loggers>

        <Logger name="com.mypackage">
            <AppenderRef ref="routing" />
        </Logger>

        <Root level="error">
            <AppenderRef ref="routing" />
        </Root>

    </Loggers>

</Configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...