如果在ELK堆栈过滤器和输出部件中的语句

时间:2015-04-10 15:59:30

标签: elasticsearch logstash kibana

我有很多主机通过ELK堆栈可视化记录。(~1000机器)所以我需要做这个部分apprx。如下所示1000次。

filter { 
        if [host] =~ /10\.1\.1\.5/ {
            grok {
                add_tag => [ "firewall" ]
                match => [ "message", "<(?<evtid>.*)>(?<datetime>(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) (?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])) (?<prog>.*?): (?<msg>.*)" ]
            }
            mutate {
                gsub => ["datetime","  "," "]
            }
            date {
                match => [ "datetime", "MMM dd HH:mm:ss" ]
                timezone => "Europe/Istanbul"
            }
            mutate {
                replace => [ "message", "%{msg}" ]
            }
            mutate {
                remove_field => [ "msg", "datetime" ]
            }
        }
    }

和此输出部分再次~1000次

output {
    if [host] =~ /10\.1\.1\.5/ {
        elasticsearch { host => localhost }
    }
} 

我想在if语句中这样做我怎么能这样做,AND,OR等?

if [host] =~ /10\.1\.1\.5/ && /10\.1\.1\.6/ && /10\.1\.1\.7/ && /10\.1\.1\.8/ ... {}

或者以其他方式做任何想法。?

1 个答案:

答案 0 :(得分:0)

As documented Logstash支持例如条件表达式中的andor,因此可以

if [host] =~ /^10\.1\.1\.5$/ or [host] =~ /^10\.1\.1\.6$/ {
  ...
}

但这不会很有效。相反,尝试找到匹配多个主机的正则表达式(可能一次全部1000个)。例如,如果要包括整个10.1.1.0/24子网,请执行以下操作:

if [host] =~ /^10\.1\.1\./ {
  ...
}

如果不可能,则另一个选项是枚举所有IP地址并使用in运算符:

if [host] in ["10.1.1.5", "10.1.1.6", "10.1.1.7"] {
  ...
}

最后一个选项是以某种方式标记来自这些主机的消息,这样您就不必将条件放在IP地址上。这似乎是最好的选择,但其可行性取决于日志的收集和运输方式。