如何在logback.xml中定义Map<String, String>?向自定义Logback布局注入静态标签的正确语法
在Logback中为自定义布局注入Map<String, String>的正确语法
要在Logback的自定义布局里注入Map<String, String>类型的静态标签,你需要调整logback.xml的配置语法——Logback对Map类型的属性有专门的解析规则,你之前的写法不符合它的要求。
正确的配置方式
Logback要求Map类型的属性通过<entry>子元素来定义每一组键值对,每个<entry>内部包含<key>和<value>标签。修改你的logback.xml中<layout>部分如下:
<layout class="com.example.CustomEncoder"> <!-- 正确的Map注入写法 --> <labels> <entry> <key>qwe</key> <value>asd</value> </entry> <!-- 可以添加更多键值对 --> <entry> <key>appName</key> <value>my-demo-app</value> </entry> </labels> <pattern>%message %xException{10}</pattern> </layout>
为什么这样有效?
你的CustomEncoder类里的setLabels(Map<String, String> labels)方法是完全正确的。Logback的BeanPropertySetter机制会自动识别这个setter方法,将<labels>下的所有<entry>元素解析成Map的键值对,最终注入到你的自定义布局实例中。
完整的logback.xml示例
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.example.CustomEncoder"> <labels> <entry> <key>qwe</key> <value>asd</value> </entry> <entry> <key>env</key> <value>development</value> </entry> </labels> <pattern>%message %xException{10}</pattern> </layout> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration>
你的Java代码不需要做任何修改,保持现有的setLabels方法和布局逻辑即可,Logback会正确完成Map的注入。
内容的提问来源于stack exchange,提问作者Andrii Abramov
相关产品推荐
相关产品推荐

