#java #logging #log4j #log4j2
Вопрос:
из — за ограничения пространства я усекаю все строки журнала с помощью шаблона
<pattern>%d{dd MMM yyyy HH:mm:ss,SSS} [%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}] %X{RequestId} (%t) %c{2}: %.-10m%n%ex</pattern>
Однако иногда бывает непонятно, усечена строка журнала или нет, и это неудобно для отладки. Можно ли добавить префикс к усеченным строкам журнала?
напр.:
Оригинал: log more than ten chars
До: log more t
После: truncated-log more than t
Ответ №1:
Да, это можно сделать с помощью ScriptPatternSelector
инструкции, описанной в руководстве log4j2 в разделе PatternLayout. Вы можете настроить селектор для выбора шаблона в зависимости от длины отформатированной строки сообщения. Ниже приведен пример кода для демонстрации.
Вот этот log4j2.xml конфигурационный файл:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="maxMsgLength">10</Property>
<Property name="basePattern">%d{dd MMM yyyy HH:mm:ss,SSS} [%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}] %X{RequestId} (%t) %c{2}: %.-${maxMsgLength}m%n%ex</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<ScriptPatternSelector>
<Script name="Selector" language="javascript"><![CDATA[
if(logEvent.getMessage().getFormattedMessage().length() > ${maxMsgLength}){
"P1";
}else{
"P2";
}
]]>
</Script>
<PatternMatch key="P1" pattern="Truncated ${basePattern}"/>
<PatternMatch key="P2" pattern="${basePattern}"/>
</ScriptPatternSelector>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Вот класс Java для создания некоторых сообщений журнала:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SomeClass {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
log.info("Here's a long message!");
log.info("Short msg");
}
}
Наконец, вот результат вышесказанного:
Truncated 20 Jul 2021 22:47:34,531 [I] (main) example.SomeClass: Here's a l
20 Jul 2021 22:47:34,641 [I] (main) example.SomeClass: Short msg