在 logstash 配置文件中,如何计算两个 UNIX 格式日期字段之间的差异?

In logstash config file, How to calculate the difference between two UNIX format date fields?

这是我的 logstash 配置文件中的过滤器部分。

filter {
mutate {  
    split => ["message", "|"]
    add_field => {
        "start_time" => "%{[message][1]}"
        "end_time" => "%{[message][2]}"
        "channel" => "%{[message][5]}"
        "[range_time][gte]" => "%{[message][1]}"
        "[range_time][lte]" => "%{[message][2]}"
        # "duration" => "%{[end_time]-[start_time]}"
    }
    # remove_field => ["message"]
} 
date {
    match => ["start_time", "yyyyMMddHHmmss"]
    target => "start_time"
}
date {
    match => ["end_time", "yyyyMMddHHmmss"]
    target => "end_time"
}
ruby { 
    code => 
    "
    event.set('start_time', event.get('start_time').to_i)
    event.set('end_time', event.get('end_time').to_i)
    " 
}
mutate {
    remove_field => ["message", "@timestamp"]
}
ruby { 
    init => "require 'time'" 
    code => "event['duration'] = event['end_time'] - event['start_time'];" 
}

最后,我想创建一个名为 duration 的新字段来表示 end_time 和 start_time 之间的差异。

显然,最后 ruby 部分是错误的。这部分怎么写?

首先,您必须确保在设置值之前存在要放置持续时间的字段。 确保您预先添加该字段。 因为它将是数字,你可以这样做

mutate {
  add_field {
    "duration" => 0
  }
}

在此之后,您可以计算该值并使用 ruby

进行设置
ruby {
  code => "event.set('duration', event.get('end_time').to_i - event.get('start_time').to_i)"
}