解析一个logstash记录?修复提取物?

时间:2014-10-31 06:26:49

标签: elasticsearch logstash kibana amazon-cloudtrail

我正在接收JSON消息(Cloudtrail,许多对象连接在一起),当我完成过滤它时,Logstash似乎没有正确解析消息。就好像将哈希简单地转储到字符串中一样。

无论如何,这里是输入和过滤器。

input {
  s3 {
    bucket => "stanson-ops"
    delete => false
    #snipped unimportant bits
    type => "cloudtrail"
  }
}

filter {
  if [type] == "cloudtrail" {
    json { # http://logstash.net/docs/1.4.2/filters/json
      source => "message"
    }
    ruby {
      code => "event['RecordStr'] = event['Records'].join('~~~')"
    }
    split {
      field => "RecordStr"
      terminator => "~~~"
      remove_field => [ "message", "Records" ]
    }
  }
}

到我完成时,elasticsearch条目包含一个RecordStr密钥,其中包含以下数据。它没有message字段,也没有Records字段。

{"eventVersion"=>"1.01", "userIdentity"=>{"type"=>"IAMUser", "principalId"=>"xxx"}}

请注意,不是 JSON样式,已经过解析。 (这对于concat-gt;拆分工作很重要。)

因此,RecordStr键看起来不是一个值。此外,在Kibana中,可过滤字段包括RecordStr(无子字段)。它包含一些不再存在的条目:Records.eventVersionRecords.userIdentity.type

为什么?我怎样才能得到合适的字段?

编辑1 这里是输入的一部分。

{"Records":[{"eventVersion":"1.01","userIdentity":{"type":"IAMUser",

这是未经批准的JSON。看来文件的正文(上面)位于message字段中,json将其提取出来,最后我会在Records字段中找到一组记录。这就是为什么我加入并拆分它 - 然后我最终得到单个文档,每个文档都有一个RecordStr条目。但是,模板(?)似乎并不了解新结构。

1 个答案:

答案 0 :(得分:0)

我已经设计出一种方法,该方法可以根据您的请求为适当的CloudTrail字段建立索引。这是修改后的输入和过滤器配置:

input {
  s3 {
    backup_add_prefix => \"processed-logs/\"
    backup_to_bucket => \"test-bucket\"
    bucket => \"test-bucket\"
    delete => true
    interval => 30
    prefix => \"AWSLogs/<account-id>/CloudTrail/\"
    type => \"cloudtrail\"
  }
}

filter {
  if [type] == \"cloudtrail\" {
    json {
      source => \"message\"
    }
    ruby {
      code => \"event.set('RecordStr', event.get('Records').join('~~~'))\"
    }
    split {
      field => \"RecordStr\"
      terminator => \"~~~\"
      remove_field => [ \"message\", \"Records\" ]
    }
    mutate {
      gsub => [
        \"RecordStr\", \"=>\", \":\"
      ]
    }
    mutate {
      gsub => [
        \"RecordStr\", \"nil\", \"null\"
      ]
    }
    json {
      skip_on_invalid_json => true
      source => \"RecordStr\"
      target => \"cloudtrail\"
    }
    mutate {
      add_tag => [\"cloudtrail\"]
      remove_field=>[\"RecordStr\", \"@version\"]
    }
    date {
      match => [\"[cloudtrail][eventTime]\",\"ISO8601\"]
    }
  }
}

此处的主要观察结果是,分割完成后,事件中不再拥有有效的json,因此需要执行mutate替换(将'=>'转换为':',将'nil'转换为'null') 。此外,我发现从CloudTrail eventTime中获取时间戳并清理不必要的字段很有用。