logstash计算经过的时间不起作用

时间:2015-04-07 07:48:00

标签: logstash

我的文件包含一系列此类消息:

component+branch.job                                 2014-09-04_21:24:46   2014-09-04_21:24:49

它是字符串,一些空格,第一个日期和时间,一些空格和第二个日期和时间。目前我正在使用这样的过滤器:

  grok {
    match => [ "message", "%{WORD:componentName}\+%{WORD:branchName}\.%{DATA:jobType}\s+20%{DATE:dateStart}_%{TIME:timeStart}\s+20%{DATE:dateStop}_%{TIME:timeStop}" ]
  }
  mutate {
    add_field => {"tmp_start_timestamp" => "20%{dateStart}_%{timeStart}"}
    add_field => {"tmp_stop_timestamp" => "20%{dateStop}_%{timeStop}"}
  }
  date {
    match => [ "tmp_start_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    add_tag => [ "jobStarted" ]
  }
  date {
    match => [ "tmp_stop_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => "stop_timestamp"
    remove_field => ["tmp_stop_timestamp", "tmp_start_timestamp", "dateStart", "timeStart", "dateStop", "timeStop"]
    add_tag => [ "jobStopped" ]
  }
  elapsed {
    start_tag => "jobStarted"
    end_tag => "jobStopped"
    unique_id_field => "message"
  }

结果我收到" @ timestamp"和" stop_timestamp"带有日期时间数据和两个标记的字段,没有经过时间计算。我错过了什么?

更新

我尝试在两个单独的事件上拆分(作为@Rumbles建议)事件,但不知何故logstash创建了两个相同的事件:

input {
    stdin { type => "time" }
}
filter {
  grok {
    match => [ "message", "%{WORD:componentName}\+%{WORD:branchName}\.%{DATA:jobType}\s+20%{DATE:dateStart}_%{TIME:timeStart}\s+20%{DATE:dateStop}_%{TIME:timeStop}" ]
  }
  mutate {
    add_field => {"tmp_start_timestamp" => "20%{dateStart}_%{timeStart}"}
    add_field => {"tmp_stop_timestamp" => "20%{dateStop}_%{timeStop}"}
    update => [ "type", "start" ]
  }
  clone {
    clones => ["stop"]
  }
if [type] == "start" {
  date {
    match => [ "tmp_start_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => ["start_timestamp"]
    add_tag => [ "jobStarted" ]
  }
}
if [type] == "stop" {
  date {
    match => [ "tmp_stop_timestamp", "YYYY-MM-dd_HH:mm:ss" ]
    target => "stop_timestamp"
    remove_field => ["tmp_stop_timestamp", "tmp_start_timestamp", "dateStart", "timeStart", "dateStop", "timeStop"]
    add_tag => [ "jobStopped" ]
  }
}
  elapsed {
    start_tag => "jobStarted"
    end_tag => "jobStopped"
    unique_id_field => "message"
    timeout => 15
  }
}

output {
    stdout { codec => rubydebug }
}

1 个答案:

答案 0 :(得分:1)

我从未使用过这个过滤器,但我刚刚快速阅读了文档,我想我理解你遇到的问题。

从您的描述中我相信您正在尝试在一个事件上运行已过滤的过滤器,从过滤器预期有2个事件的文档出现,一个带有开始时间,第二个带有结束时间,带有一个公共ID帮助过滤器识别2个事件的匹配时间:

  

此过滤器管理的事件必须具有某些特定属性。描述任务开始的事件(“开始事件”)必须包含等于'start_tag'的标记。另一方面,描述任务结束的事件(“结束事件”)必须包含等于'end_tag'的标记。这两种事件都需要拥有一个ID字段,该ID字段唯一地标识该特定任务。该字段的名称存储在“unique_id_field”中。

每条消息都被视为一个事件,因此您需要将消息拆分为两个事件,并让每对事件都有唯一的标识符,以帮助过滤器将它们重新链接在一起。它不是一个整洁的解决方案(将您的事件分成两个事件,然后再重新连接它们)可能有一个更好的解决方案,我不知道。