如果在MDC上设置了值,如何在log4j条目上打印键/值对?
例如,我目前有以下模式:
%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - client=%X{client} %m%n
只有在MDC上有一个关于此密钥的值时,才打印“client =”部分。
例如,在启动我的程序时,将没有客户端登录,因此将使用此模式记录日志:
%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
但是,在客户端登录后(以及在我使用“客户端”密钥设置MDC之后),我需要使用以下内容进行打印:
%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - client=%X{client} %m%n
log4j上有这样的“条件模式”吗?
谢谢
答案 0 :(得分:6)
There is a %notEmpty
pattern在Log4j2中,您可以实现此目标。
%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %notEmpty{client=%X{client} }%m%n
答案 1 :(得分:4)
我很乐意使用xav的建议。
我删除了" client ="每次我向MDC添加一个条目时,来自log4j模式的字符串并附加它。它不是最美丽的解决方案,但效果很好!
例如,我将使用
MDC.put("client", client.getId());
我现在正在使用:
MDC.put("client", "client="+client.getId().toString());
答案 2 :(得分:0)
建议的 hack 将键值保持为 MDC 值有助于将键名绑定到代码中的某个常量。但这对微服务不利,例如标头被重新发送到其他服务并且键名被重复。
有一个干净的 SLF4J 模式逻辑解决方案可以实现这一点:
%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %replace( client=%mdc{client}){' client=$', ''} %m%n