我有一个看起来像这样的日志条目
{"logVersion":"1","timestamp":"2020-05-21T06:35:09.021Z","labels":{},"event":{"severity":"INFO","message":”hello world”}}
我希望字段“标签”包含Labels类中的映射中的键和值,并且这些值可以在运行时根据所调用的服务和控制器进行更改。但是,通读https://github.com/logstash/logstash-logback-encoder我没有发现这样做的可能。
最终结果应该是这样。从Map中获取的数据位于标签Class中。
Map<String, String> labels = new HashMap<>();
labels.put("x", "label1");
labels.put("y", "label2");
log.info("hello world");
和结果
{"logVersion":"1","timestamp":"2020-05-21T06:35:09.021Z","labels":{"x", "label1", "y": "label2"},"event":{"severity":"INFO","message":”hello world”}}
我也尝试过将这些值从map添加到MDC并打印出来,但是问题是,尽管我可以排除已知的MDC密钥,但是添加的任何其他MDC仍将显示在该标签字段中
也不能选择用杰克逊序列化地图,因为结果看起来像这样-
{"logVersion":"1","timestamp":"2020-05-21T07:01:07.604Z","labels":"{\”label1\":\”label1Value\",\”label2\":\”label2Value\"}","event":{"severity":"INFO","message":"hello world”}}
因此设法解决了我的问题,因此输出看起来应该是应该的
public void setLabels(Map<String, String> labels) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String labelJson = mapper.writeValueAsString(labels);
MDC.put("labels", labelJson);
}
并添加到我添加的logback.xml中
<pattern>
<pattern>
{
"labels": "#asJson{%mdc{labels}}"
}
</pattern>
</pattern>