LOG4J 在日志行中添加一些前缀以指示日志被截断
LOG4J add some prefix in the log line to indicate the log is truncated
由于 space 限制,我将截断所有具有模式布局的日志行
<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有没有被截断会造成混淆,不方便调试。是否可以为被截断的日志行添加前缀?
例如:
原文:log more than ten chars
之前:log more t
之后:truncated-log more than t
是的,这可以通过使用 ScriptPatternSelector
来完成,如 PatternLayout 下的 log4j2 手册中所述。您可以将选择器设置为根据格式化消息字符串的长度来选择模式。下面是示例代码来演示。
这是 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 class 来生成一些日志消息:
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
由于 space 限制,我将截断所有具有模式布局的日志行
<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有没有被截断会造成混淆,不方便调试。是否可以为被截断的日志行添加前缀?
例如:
原文:log more than ten chars
之前:log more t
之后:truncated-log more than t
是的,这可以通过使用 ScriptPatternSelector
来完成,如 PatternLayout 下的 log4j2 手册中所述。您可以将选择器设置为根据格式化消息字符串的长度来选择模式。下面是示例代码来演示。
这是 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 class 来生成一些日志消息:
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