Мой файл 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>