Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j2编程消息替换(替换log4j中的PatternLayout)_Java_Logging_Log4j_Log4j2_Slf4j - Fatal编程技术网

Java Log4j2编程消息替换(替换log4j中的PatternLayout)

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]+}{} 这似乎是一个重复的问题: 另一

我们正在将日志从log4j迁移到log4j2。但是,我在迁移扩展了
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/:?]