使用ElasticSearch和Logstash将json对象分解为多个字段

时间:2018-01-08 22:58:07

标签: elasticsearch logstash pm2 filebeat

继续我与ElasticSearch的爱恨交织,我试图将信息从pm2(nodejs)记录到我的弹性搜索群集。

目前的设置如下:

Pm2管理一些节点应用程序,并配置为登录json。这是一个例子:

{"message":"{\n  \"className\": \"AppointmentBot\",\n  \"dialog\": \"query\",\n  \"step\": 2,\n  \"millis\": 1497,\n  \"extra\": \"\",\n  \"type\": \"logger\",\n  \"level\": \"info\",\n  \"message\": \"Client\",\n  \"timestamp\": \"08-01-2018 22:44:22 +00:00\"\n}\n","timestamp":"2018-01-08T22:44:22.350Z","type":"out","process_id":9,"app_name":"Chatbot-App-Dev"}

Filebeat配置

type: log
  enabled: true
  paths:
    /home/app/.pm2/logs/*.log
  fields:
    type: pm2

Logstash config:

if [fields][type] == "pm2" {
        json {
            source => "message"
            remove_field => ["message"]
        } 

        date {
            match => [ "timestamp", "yyyy-MM-dd HH:mm:ssZ" ]
            tag_on_failure => ["_dateparsefailure"]
        }
    }

这在Kibana / ElasticSearch中产生类似的东西:

{
  "className": "AppointmentBot",
  "dialog": "query",
  "step": 2,
  "millis": 1497,
  "extra": "",
  "type": "logger",
  "level": "info",
  "message": "Client",
  "timestamp": "08-01-2018 22:44:22 +00:00"
}

现在,我想要的是让那些JSON字段不在一个字段中,而是在一个字段上。

一些警告:

  • 我不想使用硬编码的变种,我认为这可以用它来解决,因为我不想对字段进行硬编码。有时候对象可能会有所不同。

基本上,我想解析json,每个字段都将它添加为索引中的新字段。可能是根结构或根中的所有字段,我不介意。

1 个答案:

答案 0 :(得分:0)

我终于在Elastic支持的帮助下解决了这个问题。问题是如果要引用logstash配置中的字段,则需要使用[A] [B]表示法。基本上,我的第二个过滤器没有运行,因为我使用的是pm2.message。

这是我的最终配置,有效:

json {
            source => "message"
            target => "[pm2]"
            remove_field => "message"
            skip_on_invalid_json => true
        }

        if "_jsonparsefailure" not in [tags]  {
            json {
                source => "[pm2][message]"
                target => "[pm2][data]"
                remove_field => "[pm2][message]"
                skip_on_invalid_json => true
            }
        }