LOG4J добавьте некоторый префикс в строку журнала, чтобы указать, что журнал усечен

#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