Filebeat/Logstash多行系统日志解析

Filebeat/Logstash多行系统日志解析,logstash,elastic-stack,logstash-grok,filebeat,Logstash,Elastic Stack,Logstash Grok,Filebeat,我正在将系统日志解析到ELK堆栈中。 系统日志示例 7月19日10:47:21主持人abc系统D:启动我的服务 7月19日10:47:29主机abc系统D:已启动服务。 7月19日10:47:29主持人abc系统D:正在启动服务。。。 理想情况下,我们希望将第二行和第三行聚合为一条消息,例如返回:startedservice。正在启动服务。。。 因此,我希望时间戳、主机名和程序名在合并行之前匹配。您可以使用过滤器来实现所需的功能。聚合筛选器支持基于公共字段值将多个日志行聚合为单个事件。在您的例

我正在将系统日志解析到ELK堆栈中。 系统日志示例 7月19日10:47:21主持人abc系统D:启动我的服务 7月19日10:47:29主机abc系统D:已启动服务。 7月19日10:47:29主持人abc系统D:正在启动服务。。。

理想情况下,我们希望将第二行和第三行聚合为一条消息,例如返回:startedservice。正在启动服务。。。 因此,我希望时间戳、主机名和程序名在合并行之前匹配。

您可以使用过滤器来实现所需的功能。聚合筛选器支持基于公共字段值将多个日志行聚合为单个事件。在您的例子中,公共字段是@timestamp、hostname和program_name的组合

因为syslog输入已经正确地解析了syslog行,所以我们不需要做任何事情,所以我们可以立即利用聚合过滤器。我们根据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 {
  ...
}