java - 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
解决方案
是的,这可以通过使用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
推荐阅读
- android - 应用插件请求时发生异常 [id: 'com.android.application']
- php - 创建具有多个 db 信息的 db conn 文件
- pandas - 如何在 Pandas 中使用掩码捕获所有符合要求的值?
- performance - Elasticsearch 随机慢查询问题排查
- android - android Room 数据库中的 SQL LEN 等价物是什么?
- python - Python PyQt5 - 如何重命名表头?
- vue.js - 像对象这样的道具的默认值不起作用
- postgresql - 如何为 Timescale 中的现有表创建物化视图?
- python - BeautifulSoup:重复列
- python - 在连续运行中打开线程时避免增加运行时间