如何使用 logstash-logback-encoder 自定义 JSON Logging 的消息属性?

问题描述

我正在使用 logstash-logback-encoder 以 json 格式打印日志。

下面是我的 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="sample" class = "org.ssn.app.config.CustomLogService">
</appender>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
    <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
    </encoder> 
    
 
  </appender>
  <logger name="org.ssn.app" additivity="false" level="DEBUG">
    <appender-ref ref="STDOUT"/>
</logger>
  <root level="INFO">
  
    <appender-ref ref="STDOUT"/>
    
  </root> 
  
  
</configuration>
  1. 在我的代码片段下方
    JSONObject lJsonObj = new JSONObject();
    lJsonObj.put("dl_no","DL10252");
    logger.debug(lJsonObj.toString,Markers.append("ss","sss"));
  1. 输出如下
{
    "@timestamp": "2021-06-17T18:49:07.914+05:30","@version": "1","message": "{\"dl_no\":\"DL10252\"}","logger_name": "org.ssn.app.controller.TestController1","thread_name": "http-nio-8080-exec-1","level": "DEBUG","level_value": 10000,"ss": "sss"
}

有没有办法修改消息属性的值数据类型,这样我们就可以避免使用“\”>反斜杠?因为通常我想将 JSON 或嵌套的 JSON 放入消息属性的 >value 并希望在没有任何反斜杠的情况下查看它们

解决方法

日志事件的 message 字段通常是字符串,因为大多数记录器语句都是字符串。

由于 message 字段是字符串,因此字符串值中的任何双引号字符 (") 都必须转义。这意味着如果消息字段值中包含 JSON,则双引号字符将被转义.

编码器无法知道消息值是正确格式化的 JSON。因此,它必须对其进行转义以确保为日志事件生成的 JSON 是正确的 JSON。

如果您有一个预序列化的 JSON 值要包含在 JSON 日志事件中,那么您可以使用 Markers.appendRawStructuredArguments.raw 将您的值添加到不同的字段(而不是 { {1}} 字段)。

例如:

message

这会产生类似的结果:

JSONObject lJsonObj = new JSONObject();
lJsonObj.put("dl_no","DL10252");
String jsonString = lJsonObj.toString()

// using markers
logger.debug(Markers.appendRaw("my_field",jsonString),"my message");

// using structured arguments
logger.debug("my message",StructuredArguments.raw("my_field",jsonString));

或者,您可以让编码器序列化值,而不是预先序列化 JSON 字符串。例如,以下将产生与上面相同的结果...

{
    "@timestamp": "2021-06-17T18:49:07.914+05:30","@version": "1","message": "my message","logger_name": "org.ssn.app.controller.TestController1","thread_name": "http-nio-8080-exec-1","level": "DEBUG","level_value": 10000,"my_field": {"dl_no" : "DL10252"}
}