Logstash:保持事件的价值

时间:2015-03-25 14:14:35

标签: date grep logstash multiline logstash-grok

我的日期只在每个日志文件中出现一次,我试图在匹配一次之后将此日期添加到所有后续事件中,使其在某些方面充当全局变量。 (日期位于文档的顶部,我无法使用multiline或更改文件名或内容)

为此,我的方法是使用grep过滤器drop => false

grok {
    patterns_dir => "[...]"
    match => [ "message", "%{DATELINE}" ]
    tag_on_failure => [ ]
}
grep {
    add_field => { "grepdate" => "%{mydate}" }
    drop => false
}
date {
    locale => "en"
    timezone => "Europe/Paris"
    match => [ "grepdate", "yyyyMMdd" ]
    target => "grepdate"
}

正则表达式:

DATELINE (= Date: (?<mydate>[0-9]{8}))

我注意到grepdate字段正确地添加到所有事件中 - 这就是我想要的 - 但该字段的值不是日期本身(%{mydate}的值) ,但是实际的字符串"%{mydate}",除了第一次实际匹配时(在我的日志文件中解析实际日期时,grepdate字段包含正确的值)

我该怎么做才能解决这个问题?

非常感谢任何帮助。

修改

我现在正在尝试使用memorize插件的解决方案。但是,我收到以下错误:

  

不能使用超过1个过滤器工作器,因为以下插件   不要与一个以上的工人合作:记住

有没有办法让这个过滤器线程安全?

1 个答案:

答案 0 :(得分:3)

也许您应该使用官方aggregate filter,因为memorize不是正式的will not work with Logstash >2.0

会是这样的:

# same as what you have now
grok {
    patterns_dir => "[...]"
    match => [ "message", "%{DATELINE}" ]
    tag_on_failure => [ "not_date_line" ]

}
# add a fictional taskId field to correlate all lines
mutate {
   add_field => { "taskId" => "all" }
}

# if we're processing the first line, remember the date
if "not_date_line" not in [tags] {
    aggregate {
        task_id => "%{taskId}"
        code => "map['mydate'] = event['mydate']"
    }
} 
# if we're processing the next lines, add the date
else {
    aggregate {
        task_id => "%{taskId}"
        code => "event['mydate'] = map['mydate']"
        map_action => "update"
        timeout => 0
    }
}

然后,您的所有活动都会有一个mydate字段,其日期位于第一个日志行中。

相关问题