如何在LOG4J模式上有条件地从MDC添加文本?

时间:2014-07-07 17:53:54

标签: log4j

如果在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上有这样的“条件模式”吗?

谢谢

3 个答案:

答案 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