Fluentbit 嵌套 json 解析

Red*_*ssi 5 parsing json fluent-bit

我有以下日志


{
  "log": {
    "header": {
      "key": "value",
      "nested": "{\"key1\":\"value\",\"key2\":\"value\"}",
      "dateTime": "2019-05-08T20:58:06+00:00"
    },
    "body": {
      "path": "/request/path/",
      "method": "POST",
      "ua": "curl/7.54.0",
      "resp": 200
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 Fluentbit 聚合日志,并且希望整个记录为 JSON。具体问题是“log.header.nested”字段,它是一个 JSON 字符串。如何解析该字符串并将其替换为其内容?

我尝试使用Fluentbit的解析器过滤器。但我有一个问题,key_name它不能很好地处理嵌套的 json 值。我尝试使用非嵌套字段在本地测试它,并且以下配置有效:

[INPUT]
    name             tail
    path             nst.log
    read_from_head   true
    Parser           json
[FILTER]
    name          parser
    Match         *
    Parser        json
    key_name      log
    Reserve_Data  On

[FILTER]
    name          parser
    Match         *
    Parser        json
    key_name      nested
    Reserve_Data  On

[OUTPUT]
    name             stdout
    match            *
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此过滤器来过滤嵌套值时:

[FILTER]
    name          parser
    Match         *
    Parser        json
    key_name      log.header.nested
    Reserve_Data  On
Run Code Online (Sandbox Code Playgroud)

它不起作用,Fluentbit 文档中没有任何关于如何在key_name文件中使用嵌套键的内容。所以我尝试:

  • log.header.nested
  • log_header_nest
  • log['header']['nest']
  • log[header][nest]

为了清楚起见,我希望 Fluentbit 输出的日志如下所示:

[INPUT]
    name             tail
    path             nst.log
    read_from_head   true
    Parser           json
[FILTER]
    name          parser
    Match         *
    Parser        json
    key_name      log
    Reserve_Data  On

[FILTER]
    name          parser
    Match         *
    Parser        json
    key_name      nested
    Reserve_Data  On

[OUTPUT]
    name             stdout
    match            *
Run Code Online (Sandbox Code Playgroud)

lan*_*l79 2

您可以尝试将 Nest 过滤器插件与 Parser 过滤器插件结合起来。例如,我设法使用以下配置在第一级解析嵌套 json:

    [FILTER]
        Name               nest
        Match              application.*
        Operation          lift
        Nested_under       log_processed
        Add_prefix         log_
        Wildcard           message
   [FILTER]
       Name                parser
       Match               application.*
       Key_Name            log_message
       Parser              docker        
       Preserve_Key        On
       Reserve_Data        On 
Run Code Online (Sandbox Code Playgroud)

在两个过滤器之前的消息是:

{
  "time": "2022-05-10T19:43:04.655207298Z",
  "stream": "stdout",
  "_p": "F",
  "log": "{\"timestamp\":\"2022-05-10 19:43:04.654\",\"level\":\"DEBUG\",\"nested\":"{\"key1\":\"value\",\"key2\":\"value\"}",\"context\":\"default\"}",
  "log_processed": {
      "timestamp": "2022-05-10 19:43:04.654",
      "level": "DEBUG",     
      "message": "{\"key1\":\"value\",\"key2\":\"value\"}",
      "context": "default"
   }
 }
Run Code Online (Sandbox Code Playgroud)

经过两个过滤器后,一级嵌套 json 被解析为:

{
  "time": "2022-05-10T19:43:04.655207298Z",
  "stream": "stdout",
  "_p": "F",
  "log": "{\"timestamp\":\"2022-05-10 19:43:04.654\",\"level\":\"DEBUG\",\"nested\":"{\"key1\":\"value\",\"key2\":\"value\"}",\"context\":\"default\"}",
  "log_processed": {
      "timestamp": "2022-05-10 19:43:04.654",
      "level": "DEBUG",     
      "message": "{\"key1\":\"value\",\"key2\":\"value\"}",
      "context": "default"
   },
 log_message: "{\"key1\":\"value\",\"key2\":\"value\"}".
 "key1" : "value",
 "key2" : "value"
}
Run Code Online (Sandbox Code Playgroud)

您可以尝试多次应用带有电梯操作的 Nest 插件。