首页 > 解决方案 > LOG4J 在日志行中添加一些前缀以指示日志被截断

问题描述

由于空间限制,我正在使用模式布局截断所有日志行

<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

标签: javalogginglog4jlog4j2

解决方案


是的,这可以通过使用ScriptPatternSelectorlog4j2 手册中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

推荐阅读