当前位置: 首页 > 知识库问答 >
问题:

Log4j2编程消息替换(从log4j替换PatternLayout)

笪德华
2023-03-14

如果满足条件,我们如何替换日志字符串中的某些字符,有什么想法吗?

共有1个答案

桑璞
2023-03-14

对于另一个关于将异常日志路由到单独的appender的问题,您可以尝试类似于我建议的方法。您可以使用一个appender,该appender拒绝带有异常的消息(通过设置exceptionfilter属性onmatch=“deny”),同时使用与devwebcl建议的替换模式类似的替换模式

%替换{%msg}{[\r\n]+}{}

然后有第二个appender,它将处理带有异常的消息。此追加器将不使用替换模式。

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!");
    }
}
<?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/:?]

请注意,过滤器类与我的另一个答案中的类相同。

还要注意,我不完全确定如果与异步日志一起使用,这将如何工作。在异步方案中,使用指向同一文件的2个追加器可能会出现一些问题。

 类似资料:
  • 我试图用HttpResponseMessage返回一个错误消息,但我得到的是我假定的< code>StringContent。ToString()。这是我的代码: 错误状态代码类似于401、404等。消息是纯文本的,如“照片未找到”或“错误的参数”。我的期望是,当出现错误时,用状态代码(401等)进行响应。)和一条纯文本错误消息。我收到的是HTML格式的响应,状态代码为200,内容如下: Stat

  • 我只是想知道有没有什么方法可以为log4j中的属性替换提供默认值呢? 我想在Java系统属性中传递文件路径,然后与“${env:MySystemProperty}”一起使用。但如果开发人员忘记设置此属性怎么办?那么我希望在log4j2.xml中定义一些有意义的默认值。 你知道如何实现这个功能吗? 编辑: 环境替换对我不起作用: standalone.conf log4j2.xml 我可以在wild

  • Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。 replace 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。 在你用一个不同的提交替换历史中的一个提交时,这会非常有用。 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据

  • 也许可以在某个配置文件中完成。有人已经做过了吗?

  • 我已经用ConsoleAppender在log4j记录器上创建了一个记录器。代码如下, 我没有使用log4j.properties文件,因为我不确定将其放在何处。上面的代码在控制台上运行良好,日志记录正常。现在我要更改它,以便与FileAppender一起使用。 我简单地更新了静态构造函数, 并添加了中的。但现在我得到了这个错误, LOG4J:错误,未为名为[null]的追加器设置输出流或文件。

  • 我正在使用一些非常古老的。 我试图通过删除非字母字符(标点符号和数字等)来净化一些输入 通常我会做这样的事情: 然而,是在中引入的!所以它不会编译!http://docs.oracle.com/javase/7/docs/api/java/lang/string.html#ReplaceAll(java.lang.string,java.lang.string) 在之前,我们是如何做到这一点的?