Filebeat / Logstash多行系统日志解析

时间:2018-07-19 11:11:59

标签: logstash elastic-stack logstash-grok filebeat

我正在将系统日志解析到ELK堆栈中。 Syslog示例 Jul 19 10:47:21 host-abc systemd: Started myservice Jul 19 10:47:29 host-abc systemd: Started service. Jul 19 10:47:29 host-abc systemd: Starting service...

理想情况下,您希望将第二行和第三行汇总为一条消息,例如返回:Started Service. Starting service... 因此,在合并行之前,我希望时间戳,主机名和程序名匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用aggregate过滤器来实现所需的功能。 aggregate过滤器支持基于公共字段值将几条日志行聚合到一个事件中。在您的情况下,公共字段将是@timestamphostnameprogram_name的组合。

由于syslog输入已经正确解析了syslog行,因此我们不需要做任何事情,因此我们可以立即利用aggregate过滤器。我们基于SYSLOGBASE2字段汇总行,其中将包含所有冒号字符:。然后,我们简单地收集所有消息,最后将消息连接成字符串。它是这样的:

input {
  syslog {
    ...
  }
}
filter {
  aggregate {
    task_id => "%{SYSLOGBASE2}"
    code => "map['message'] ||= []; map['message'].push(event.get('message'));"
    push_map_as_event_on_timeout => true
    timeout_task_id_field => "user_id"
    timeout => 1 # 1 second timeout
    timeout_tags => ['_aggregatetimeout']
    timeout_code => "event.set('message', map['message'].join(' '))"
  }
}
output {
  ...
}