java - 从 Logback 中的 java 类中读取值
问题描述
我有一个看起来像这样的日志条目
{"logVersion":"1","timestamp":"2020-05-21T06:35:09.021Z","labels":{},"event":{"severity":"INFO","message":”hello world”}}
我希望字段“标签”包含标签类中映射的键和值,并且这些值可以在运行时根据调用的服务和控制器而改变。但是通过https://github.com/logstash/logstash-logback-encoder阅读我没有发现这样做的可能性。
最终结果应该是这样的。从标签类中的地图获取的数据。
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 仍将显示在该标签字段中
同样用杰克逊序列化该地图也不是选项,因为结果将如下所示 -
{"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>
推荐阅读
- php - 在 Laravel 中启动 php.exe 时出现错误 0x2
- html - 如何进入内部 Maybe monad 从纯脚本中的 html 按钮中提取类名?
- html - 自动调整 div 边距顶部动态
- python - 如何使用python获取thingspeak通道的field1值
- typo3-8.x - TYPO3 类型为 xxx\\yyy\\Domain\\Model\\User 的对象,身份为 \"1\" 未找到。"
- javascript - 如何处理异步/等待获取 API 中的错误 404
- android - 我找不到 android.test 命名空间
- leaflet - Leaflet.Deflate 与 Leaflet.markercluster 在悬停时不显示集群覆盖
- arrays - Matlab:计算对象数组中每个对象的函数
- magento2 - Magento 2:Ajax 调用列行操作时显示加载器?