Java Log4j2编程消息替换(替换log4j中的PatternLayout)
我们正在将日志从log4j迁移到log4j2。但是,我在迁移扩展了Java Log4j2编程消息替换(替换log4j中的PatternLayout),java,logging,log4j,log4j2,slf4j,Java,Logging,Log4j,Log4j2,Slf4j,我们正在将日志从log4j迁移到log4j2。但是,我在迁移扩展了PatternLayout的类时遇到了问题,因为它现在是final 旧的图案布局代码将所有出现的\r和\n替换为|,如果是堆栈跟踪则除外 我查看了log4j2的文档,但还没有找到适合这种问题的方法。到目前为止,我认为这在XML配置中是不可能的,而只是在java代码中 如果满足条件,如何替换日志字符串中的某些字符?您可以使用regexp替换这些字符 %replace{%msg}{[\r\n]+}{} 这似乎是一个重复的问题: 另一
PatternLayout
的类时遇到了问题,因为它现在是final
旧的图案布局代码将所有出现的\r
和\n
替换为|
,如果是堆栈跟踪则除外
我查看了log4j2的文档,但还没有找到适合这种问题的方法。到目前为止,我认为这在XML配置中是不可能的,而只是在java代码中
如果满足条件,如何替换日志字符串中的某些字符?您可以使用regexp替换这些字符
%replace{%msg}{[\r\n]+}{}
这似乎是一个重复的问题:
另一方面,PatternLayout
扩展了AbstractStringLayout
,因此您可以创建一个“自定义PatternLayout”
您可以尝试一种类似于将异常日志路由到单独的附加器的方法。您可以使用一个appender来拒绝带有异常的消息(通过设置
ExceptionFilter
属性onMatch=“DENY”),同时使用类似于devwebcl建议的替换模式
%replace{%msg}{[\r\n]+}{{|}
然后有第二个appender,它将处理带有异常的消息。此追加器不会使用替换模式
下面是一个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){
if(log.isDebugEnabled())
log.debug("This is some debug!\r\nThis is the second line of debug.");
log.info("Here's some info!\r\nMore info on another line.");
log.error("Some error happened!");
try{
specialLogic();
}catch(RuntimeException e){
log.error("Woops, an exception was detected.", e);
}
}
public static void specialLogic(){
throw new RuntimeException("Hey an exception happened! Oh no!");
}
}
以下是log4j2.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<File name="ExceptionFile" fileName="logs/app.log" immediateFlush="true"
append="true">
<ThrowableFilter onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
<File name="logFile" fileName="logs/app.log" immediateFlush="true"
append="true">
<ThrowableFilter onMatch="DENY" onMismatch="NEUTRAL"/>
<PatternLayout
pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %replace{%msg}{[\r\n]+}{|}%n" />
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="logFile" />
<AppenderRef ref="ExceptionFile" />
</Root>
</Loggers>
</Configuration>
请注意,过滤器类与中的过滤器类相同
还请注意,如果与异步日志一起使用,我不完全确定这将如何工作。在异步场景中,使用指向同一文件的两个附加器可能会出现一些问题。这是否会使堆栈跟踪以换行符分隔?
2019-11-15 19:39:25.453 [main] DEBUG example.SomeClass - This is some debug!|This is the second line of debug.
2019-11-15 19:39:25.456 [main] INFO example.SomeClass - Here's some info!|More info on another line.
2019-11-15 19:39:25.456 [main] ERROR example.SomeClass - Some error happened!
2019-11-15 19:39:25.456 [main] ERROR example.SomeClass - Woops, an exception was detected.
java.lang.RuntimeException: Hey an exception happened! Oh no!
at example.SomeClass.specialLogic(SomeClass.java:25) ~[classes/:?]
at example.SomeClass.main(SomeClass.java:18) [classes/:?]