通过 Logstash 过滤器清理日志

Sanitize log via Logstash filter

我是 logstash 的新手,想看看是否有人可以帮助解析我的应用程序日志,它看起来像这样(用随机字符更改了 api 键):

2019-07-17 16:57:20,522 : braze INFO: Body: {"attributes": [{"external_id": "vT9fswqW", "email": "aaa@yahoo.com", "site": "site"}], "api_key": "fg09831e-9re0-tc19-81c6-08934539f0vx2", "events": [{"properties": {"site": "site"}, "external_id": "vT9fswqW", "name": "REGISTER", "time": "2019-07-17'+0'16:57:20.522380"}]}

此日志进入 logstash,在将日志存储到 ES 之前,可以在其中应用过滤器。我想清理此日志以隐藏某些信息,如电子邮件、external_id 和 api_key,因此 logstash 的最终输出将类似于:

2019-07-17 16:57:20,522 : braze INFO: Body: {"attributes": [{"external_id": "****", "email": "****", "site": "site"}], "api_key": "fg09831e-****", "events": [{"properties": {"site": "site"}, "external_id": "****", "name": "REGISTER", "time": "2019-07-17'+0'16:57:20.522380"}]}

{"attributes"... 开头的部分是有效的 JSON,所以我在想是否可以将日志的那部分存储在单独的字段中,然后我可以应用 json logstash 过滤器,然后改变字段。我试图分离日志以仅获取 json,但我使用 grok 的所有尝试都失败了。任何想法我怎样才能让它发挥作用?

你可以使用

    grok { match => { "message" => "Body: %{GREEDYDATA:[@metadata][json]}" } }
    json {
        source => "[@metadata][json]"
        remove_field => [ "[api_key]", "[attributes][0][email]", "[attributes][0][external_id]", "[events][0][external_id]" ]
    }

要解析消息的第一部分,我会使用 dissect 而不是 grok。