Log4j2日志异常含~[?: ]特殊符号的成因及去除方法咨询
Hey,我来帮你搞定这个Log4j2日志里的奇怪符号问题!
关于Log4j2日志中
~[?:...]符号的解析与移除方案 一、这些特殊符号的来源
你看到的~[classes/:?]、~[?:1.8.0_162]这类符号,是Log4j2默认异常堆栈格式里的类源位置标记:
~[classes/:?]:表示当前调用的类来自你项目编译后的classes目录,?是因为无法获取到该类对应的源文件行号或具体路径信息~[?:1.8.0_162]:表示这个类来自JDK核心类库(比如rt.jar),1.8.0_162是你当前使用的JDK版本,?则是因为JDK核心类通常不带调试符号,所以没有具体的源文件路径可显示
这些内容是Log4j2默认通过%throwable(或简写%ex)转换符输出的,属于异常堆栈的附加信息。
二、如何移除~[?: ]格式的符号
要去掉这些后缀,你只需要修改Log4j2的配置文件,调整异常堆栈的输出格式即可,下面分两种常见配置类型说明:
1. XML配置文件(log4j2.xml)
找到配置中的PatternLayout节点,给%throwable添加short参数,示例如下:
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%throwable{short}"/> </Console> </Appenders>
%throwable{short}会只保留异常类型、消息和方法调用栈,不会附带类的位置信息。
2. Properties配置文件(log4j2.properties)
修改对应Appender的pattern配置,同样添加short参数:
appender.console.type = Console appender.console.name = Console appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%throwable{short}
更灵活的自定义选项
如果你想进一步精简堆栈内容,还可以用这些参数:
%throwable{0}:只输出异常的基本类型和消息,不带完整堆栈%throwable{filter}:可以自定义过滤掉特定包的堆栈信息(比如JDK核心类)
验证效果
修改配置后重启应用,再次触发异常时,日志就会变成类似这样:
java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
...
那些烦人的~[?:...]后缀就消失啦!
内容的提问来源于stack exchange,提问作者Kane
相关产品推荐
相关产品推荐

