【问题标题】:Logstash: How to read single-line JSONLogstash:如何读取单行 JSON
【发布时间】:2017-02-16 15:20:09
【问题描述】:

我试图弄清楚如何使用 Logstash 读取 JSON 文件,该文件在一行中包含所有事件

示例输入:

{"metadata": {"metadata fields": "metadata data"},"results": [{"events":[{"event fields": "event data"}, {"event fields": "event data"}}],"field": {"more fields": "data"}}

扩展 JSON:

{
    "metadata": {
        "metadata fields": "metadata data"
    },
    "results": [{
            "events": [{
                    "event fields": "event data"
                }, {
                    "event fields": "event data"
                }
            }], "field": {
            "more fields": "data"
        }
    }

我试过只使用 JSON 编解码器,但是当我运行 Logstash 时,它在打印成功启动后挂起。我尝试过的另一件事是在 JSON 末尾添加换行符,但这在生产中不起作用,因为我无法控制日志的来源。

有人对如何通过 Logstash 正确解析这些日志有任何建议吗?下面是我的配置文件。提前致谢!

配置

input {
    file {
        path => "C:/Folder/*.json"
        sincedb_path => "C:\nul"
        start_position => "beginning"
        codec => "json"
        type => "data"
    }
}
output {
    stdout { codec => rubydebug }
}

【问题讨论】:

  • 那不是有效的 JSON。可能是它不起作用的原因。
  • 你知道我该如何解析它吗?
  • 一些精心设计的grok 过滤器可以完成这项工作。

标签: json file-io logstash


【解决方案1】:

您的输入缺少方括号,应该有一个:

{"metadata": {"metadata fields": "metadata data"},"results": [{"events":[{"event fields": "event data"}, {"event fields": "event data"} HERE ] }],"field": {"more fields": "data"}}

如果缺少的方括号在您所有输入文件中的相同事件前面,您可以尝试gsub

例如:

filter {
 mutate {
   gsub => [ "message", "\"}}\],\"field\"\:", "\"}\]}\],\"field\"\:" ]
 }
}

这匹配 "}}],"field": 模式并将其替换为类似的模式,但在正确的位置添加了 [。在此突变后,您可以继续使用 json 过滤器来处理消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2019-10-31
    • 2022-12-14
    相关资源
    最近更新 更多