首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用logstash编码器自定义JSON日志记录的消息属性?

如何使用logstash编码器自定义JSON日志记录的消息属性?
EN

Stack Overflow用户
提问于 2021-06-17 13:39:13
回答 1查看 2.5K关注 0票数 1

我正在使用logstash编码器以json格式打印日志。下面是我的logback-spring.xml

代码语言:javascript
运行
复制
<?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. 代码片段

代码语言:javascript
运行
复制
    JSONObject lJsonObj = new JSONObject();
    lJsonObj.put("dl_no","DL10252");
    logger.debug(lJsonObj.toString,Markers.append("ss","sss"));

  1. 输出低于

代码语言:javascript
运行
复制
{
    "@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放在message属性的>值中,并且希望在没有任何反斜杠的情况下查看它们

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-19 19:11:02

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

因为message字段是一个字符串,所以必须转义字符串值中的任何双引号("),这意味着如果消息字段值中包含了JSON,那么双引号将被转义。

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

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

例如:

代码语言:javascript
运行
复制
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));

会产生这样的结果:

代码语言:javascript
运行
复制
{
    "@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"}
}

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

代码语言:javascript
运行
复制
// using markers
logger.debug(Markers.append("my_field", Map.of("dl_no", "DL10252")), "my message");

// using structured arguments
logger.debug("my message", StructuredArguments.kv("my_field", Map.of("dl_no", "DL10252"));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68020555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档