首页 > 解决方案 > 从 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”}}

标签: javalogginglogback

解决方案


不完全是我第一次提出问题的方式,但仍然设法解决了我的问题,因此输出看起来应该如此

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>

推荐阅读