从Logback中从Java类读取值

问题描述 投票:0回答:1

我有一个看起来像这样的日志条目

{"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”}}
java logging logback
1个回答
0
投票

因此设法解决了我的问题,因此输出看起来应该是应该的

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>
© www.soinside.com 2019 - 2024. All rights reserved.