当前位置: 首页 > 知识库问答 >
问题:

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

阎善
2023-03-14

仅当值在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个答案

梅飞宇
2023-03-14

一个建议的黑客将键与值保持为MDC值有助于将键名称绑定到代码中的某些常量。但是这对于微服务来说是不好的,例如,当头被重新发送到其他服务并且键名被复制时。

有一个干净的SLF4J模式逻辑解决方案可以实现这一点:

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %replace( client=%mdc{client}){' client=$', ''} %m%n
罗凯
2023-03-14

我最终使用了xav的建议。

我从log4j模式中删除了“客户端=”字符串,并在每次向MDC添加条目时将其追加。这不是最漂亮的解决方案,但它非常有效!

例如,我本来会用

MDC.put("client", client.getId());

我现在使用:

MDC.put("client", "client="+client.getId().toString());
郎正平
2023-03-14

Log4j2中有一个%notEmpty模式,允许您完全实现这一点。

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %notEmpty{client=%X{client} }%m%n
 类似资料:
  • 我想有条件地向对象添加一个属性。目前我有这个: 问题是如果汽车。电池不存在我有电池:未定义。如果对象中不存在该属性,我宁愿不要该属性。我怎样才能做到这一点?

  • 问题内容: 如果满足特定条件,是否有办法仅向React组件添加属性? 我应该在渲染后基于Ajax调用将required和readOnly属性添加到表单元素中,但是由于readOnly =“ false”与完全省略该属性不同,因此我看不到如何解决此问题。 下面的示例应解释我想要的内容,但将无法正常工作(解析错误:意外的标识符)。 问题答案: 显然,对于某些属性,如果您传递给它的值不真实,React足

  • 我正在尝试执行以下操作以满足代码构建器的要求(具体来说是Sencha Cmd)。 这是我需要做的本质。关键因素是函数体必须以返回对象文字结束。由于生成器中的限制,我无法返回变量。那么,如果参数includeB为true,如何在下面的伪代码点添加属性“b”,但如果为false,则根本不添加属性。不允许ie b==未定义或b==null。 也许这是不可能的。 感谢阅读和考虑, 默里

  • 我现在正在一家网店工作,想做一些有条件的渲染,但我不确定如何让它工作。现在我有一个脚本,它为篮子中的所有产品提供一个与产品ID匹配的类名。 一些产品是可变产品,当选择时,包含在主要对象的价格中。该商品也可以单独购买,因此共享相同的产品ID。我想做的是只将类名添加到价格中包含的产品中。 我的想法是做一个if语句来确定产品是否有文本“包含在价格中”作为其产品总数,如果有,则添加类名。这个如果陈述让我很

  • 问题内容: 如何在jsfiddle中添加JSON文件?我有一个JSON文件,但无法将其附加到jsfiddle中。我可以制作一个JSON对象并使用它,但是有什么方法可以将外部JSON文件添加到小提琴中? 问题答案: 您可以利用跨域资源共享(CORS)的功能来完成您的任务。 基本上,CORS的工作原理是,如果在HTTP响应中设置了标头,则无论AJAX加载的内容位于同一域还是其他域中,都可以在我们的脚本

  • 是否有一种方法可以使用单个流来实现? 用两个独立的流很容易做到这一点,但我不能只用一个。