Log4j2:如何在www.example.com文件中使用替换参数log4j2.properties

sgtfey8w  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(146)

使用log4j 2,我想替换日志消息中的一些字符串(比如将***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)
...

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

EDIT:我以前也尝试过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配置,我可以得到正确的结果,但我不知道如何将其转换为属性配置。

8cdiaqws

8cdiaqws1#

对于正则表达式替换,请使用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}{.}{/}”将用正斜杠替换记录器或事件消息中的所有点。

相关问题