【问题标题】:Log4j2: How to use replace parameter in log4j2.properties fileLog4j2:如何在 log4j2.properties 文件中使用替换参数
【发布时间】:2021-04-24 23:54:24
【问题描述】:

使用 log4j2,我想替换日志消息中的一些字符串(比如将 foo 替换为 bar) .在xml配置中,我可以使用下面的配置,它可以工作。

<Appenders>
     <Console name="A1" target="SYSTEM_OUT">
         <PatternLayout pattern="[%d{HH:mm:ss}] %m%n">
             <replace regex = "foo" replacement="bar"/>
         </PatternLayout>
     </Console>
</Appenders>

但是使用 XML,我必须在我的项目中使用属性文件,所以我尝试了类似的东西

appender.A1.type = Console
appender.A1.name = A1
appender.A1.layout.type = PatternLayout
appender.A1.layout.pattern = [%d{HH:mm:ss}] %m%n
# Probably BAD code begin
appender.A1.layout.replace.regex = foo
appender.A1.layout.replace.replacement = bar
# Probably BAD code end

我得到如下错误:

Exception in thread "main" org.apache.logging.log4j.core.config.ConfigurationException: No type attribute provided for component replace
    at org.apache.logging.log4j.core.config.properties.PropertiesConfigurationBuilder.createComponent(PropertiesConfigurationBuilder.java:334)
...

如何在属性文件和 log4j2 中表示 replace,是否可以将 xml 配置中的所有内容转换为属性配置? 我正在使用 log4j-api-2.14.0.jar 和 log4j-core-2.14.0.jar。

提前谢谢!

编辑: 我之前也试过replace{pattern}{regex}{substitution}。而且我认为这与 replace 参数不同。 说模式是

appender.A1.layout.pattern = [%d{HH:mm:ss}][%C::%M] %replace{%m}{foo}{bar}%n

我会得到

[09:28:07][com.foo.MyApp::main] 111 bar 222

但我想得到的是

[09:28:07][com.bar.MyApp::main] 111 bar 222

使用上面的XML配置,我可以得到正确的结果,但我不知道如何将其转换为属性配置。

【问题讨论】:

    标签: java log4j log4j2


    【解决方案1】:

    对于正则表达式替换使用replace{pattern}{regex}{substitution} 模式。 appender.A1.layout.replace.* 必须删除。

    appender.A1.type = Console
    appender.A1.name = A1
    appender.A1.layout.type = PatternLayout
    appender.A1.layout.pattern = [%d{HH:mm:ss}] %replace{%m}{foo}{bar}%n
    
    # whole line
    appender.A1.layout.pattern = %replace{[%d{HH:mm:ss}] %m%n}{foo}{bar}
    

    更多信息

    Log4j2 - Layouts

    替换{模式}{正则表达式}{替换}

    将出现的正则表达式“regex”替换为模式评估产生的字符串中的替换“substitution”。例如,“%replace{%msg}{\s}{}”将删除事件消息中包含的所有空格。

    模式可以任意复杂,特别是可以包含多个转换关键字。例如,“%replace{%logger %msg}{.}{/}”将用正斜杠替换记录器中的所有点或事件消息。

    【讨论】:

    • 谢谢,我之前试过这个,但是我觉得这个和replace参数不同,它只能替换事件消息中的字符串,不能替换整个日志,所以包名不能更换。请查看我更新的帖子。
    • 嗨@MagicRain,您可以将整个日志事件添加为参数。我已经更新了我的答案,您可以查看whole line 选项。您可以使用许多替代方案,例如 %replace{%C %m}{foo}{bar}%n 而不是唯一的单个元素。
    猜你喜欢
    • 2014-11-10
    • 2019-08-31
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2017-03-15
    • 2018-06-12
    相关资源
    最近更新 更多