在 Logback 中从 java class 读取值
Reading values from java class in Logback
我有一个看起来像这样的日志条目
{"logVersion":"1","timestamp":"2020-05-21T06:35:09.021Z","labels":{},"event":{"severity":"INFO","message":”hello world”}}
我希望字段 "labels" 包含标签 class 中地图中的键和值,并且这些值可以在运行时根据调用的服务和控制器更改。但是通读 https://github.com/logstash/logstash-logback-encoder 我没有找到这样做的可能性。
最终结果应该是这样的。从标签 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”}}
我也尝试过将这些值从地图添加到 MDC 并将它们打印出来,但问题是虽然我可以排除已知的 MDC 密钥,但添加的任何其他 MDC 仍会显示在该标签字段中
也不能选择使用 jackson 序列化该地图,因为结果将如下所示-
{"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>
我有一个看起来像这样的日志条目
{"logVersion":"1","timestamp":"2020-05-21T06:35:09.021Z","labels":{},"event":{"severity":"INFO","message":”hello world”}}
我希望字段 "labels" 包含标签 class 中地图中的键和值,并且这些值可以在运行时根据调用的服务和控制器更改。但是通读 https://github.com/logstash/logstash-logback-encoder 我没有找到这样做的可能性。
最终结果应该是这样的。从标签 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”}}
我也尝试过将这些值从地图添加到 MDC 并将它们打印出来,但问题是虽然我可以排除已知的 MDC 密钥,但添加的任何其他 MDC 仍会显示在该标签字段中
也不能选择使用 jackson 序列化该地图,因为结果将如下所示-
{"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>