如何在同一个文件中使用Logstash处理多个输入?

时间:2015-04-14 09:15:33

标签: elasticsearch logstash grok

假设您的日志防火墙文件中有3条不同的行,您需要:

使用专用的弹性搜索输出将其存储到弹性搜索簇中。

我应该在logstash.conf中做什么?

感谢。

2 个答案:

答案 0 :(得分:0)

假设不同的日志来自同一个日志源(即同一个文件)并且应该被视为属于同一类型(即判断调用),您只需列出多个grok模式:

filter {
  grok {
    match => ["message", "pattern1", "pattern2", ..., "patternN"]
  }
}

将按顺序尝试列出的模式。

如果日志消息来自不同的输入并且完全不同,请使用type字段来区分不同的消息:

filter {
  if [type] == "foolog" {
    grok {
       match => ["message", "pattern1"]
    }
  } else if [type] == "barlog" {
    grok {
       match => ["message", "pattern2"]
    }
  }
}

此模式也适用于来自同一输入的消息,但由于您首先必须在条件中检查消息以确定要选择的类型,因此需要更多工作。

答案 1 :(得分:0)

在Magnus帖子下查看你的评论,我可以分享一些更具体的例子。

选项1)来自Fortigate的日志类似,相关的grok过滤器如下所示:

    grok {
        match => [
            "message" , "%{FORTIGATE_50_BASE} %{FORTIGATE_50_V1}",
            "message" , "%{FORTIGATE_50_BASE} %{FORTIGATE_50_V2}",
            "message" , "%{FORTIGATE_50_BASE} %{FORTIGATE_50_V3}",
            "message" , "%{FORTIGATE_50_BASE}"
        ]
        tag_on_failure => [ "failure_grok_fortigate" ]
        break_on_match => false
    }

相关的模式是:

   FORTIGATE_50_BASE %{SYSLOG5424PRI:syslog_index}date=%{FORTIDATE:date} time=%{TIME:time} devname=%{HOST:hostname} devid=%{HOST:devid} logid=%{NUMBER:logid} type=%{WORD:fortigate_type} subtype=%{WORD:subtype} level=%{WORD:loglevel} vd=\"?%{WORD:vdom}\"?
   FORTIGATE_50_V1 srcip=%{IP:srcip} srcintf=\"%{HOST:srcintf}\" dstip=%{IP:dstip} dstintf=\"%{HOST:dstintf}\" sessionid=%{NUMBER:sessionid} status=%{DATA:status} policyid=%{DATA:policyid} dstcountry=\"%{DATA:dstcountry}\" srccountry=\"%{DATA:dstcountry}\" trandisp=%{WORD:trandisp} service=%{WORD:service} proto=%{INT:proto} app=%{WORD:app} duration=%{INT:duration} sentbyte=%{INT:sentbyte} rcvdbyte=%{INT:rcvdbyte} sentpkt=%{INT:sentpkt} rcvdpkt=%{INT:rcvdpkt}
   FORTIGATE_50_V2 user=\"%{PROG:user}\" ui=%{GREEDYDATA:ui} msg=\"%{GREEDYDATA:msg}\"
   FORTIGATE_50_V3 action=\"%{PROG:action}\" tunneltype=\"%{PROG:tunneltype}\" tunnel_id=%{NUMBER:tunnel_id} remote_ip=(%{IP:remote_ip}|\(null\)) tunnel_ip=(%{IP:tunnel_ip}|\(null\)) user=\"%{PROG:user}\" group=\"%{PROG:group}\" dst_host=\"%{PROG:dst_host}\" reason=\"%{PROG:reason}\" msg=\"%{GREEDYDATA:msg}\"

因此,在所有日志和某些特定部分之间共享基本模式,并且配置grok过滤器的方式是首先处理更具体的模式,然后回退到通用模式。

选项2)您的日志看起来非常类似于键值列表,因此更简单的kv过滤器可能比任何模式都更有帮助。

在你的情况下,它可能很简单:

input {
 ...
}
filter {
  kv { }
  date { ... pull in the date data ... }
}
output {
  ..
}

希望这些都有效。总的来说,我还发现现在有一些unittests可用的日志格式非常有用。

干杯