如何为特定Log4j2 Logger配置专属属性?配置报错求解
我来帮你搞定这个配置问题!你遇到的报错是因为Log4j2的<Logger>节点并不支持<Properties>作为子元素,这是配置语法用错导致的。官方文档里提到的LoggerConfig属性,正确的配置方式是直接在<Logger>(或<Root>)节点下添加单个<Property>元素,不需要外层的<Properties>包裹。
错误原因分析
你原来的配置里用了<Properties>嵌套<Property>,但Log4j2的Logger配置结构中没有这个层级,所以才会抛出:
ERROR logger Logger has no parameter that matches element Properties
ERROR Attempted to assign attribute Properties to list of type class org.apache.logging.log4j.core.lookup.Interpolator which is incompatible with class org.apache.logging.log4j.core.config.Property.
正确的配置示例
下面是修改后的完整配置,每个Logger可以直接添加专属的<Property>:
<Configuration> <Appenders> <Console name="stdout"> <PatternLayout charset="UTF-8"> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{concern}] [%-5p] %c: %m%n</Pattern> </PatternLayout> </Console> </Appenders> <Loggers> <Root level="INFO"> <!-- 给Root日志设置默认属性,避免空值 --> <Property name="concern">general</Property> <AppenderRef ref="stdout"/> </Root> <Logger name="com.example.log4j2.Foo" level="INFO"> <Property name="concern">foo</Property> <AppenderRef ref="stdout"/> </Logger> <Logger name="com.example.log4j2.Bar" level="INFO"> <Property name="concern">bar</Property> <AppenderRef ref="stdout"/> </Logger> </Loggers> </Configuration>
关键说明
- 每个
<Logger>或<Root>节点下可以直接添加多个<Property>元素,这些属性会被自动合并到日志事件的上下文映射中,和ThreadContextMap的属性等效,你可以用%X{属性名}在Layout中引用。 - 这些属性是LoggerConfig级别的,所有通过该Logger输出的日志都会带上这个属性,不需要在代码中手动操作ThreadContext,非常适合给不同模块/类的日志打专属标记。
- 如果某个Logger没有配置
concern属性,会自动继承上级Logger(比如Root)的属性值,所以给Root设置默认值可以避免日志中出现空的[]。
测试验证
当你在com.example.log4j2.Foo类中输出日志时,会看到类似这样的日志行:
2024-05-20 14:30:00.123 [foo] [INFO ] com.example.log4j2.Foo: 这是Foo类的日志
而com.example.log4j2.Bar类的日志会显示[bar],Root级别的日志(比如其他未匹配到特定Logger的类)会显示[general]。
内容的提问来源于stack exchange,提问作者Étienne Miret

