Grok模式用于日志文件中不同类型的日志

时间:2015-07-28 03:52:59

标签: logstash logstash-grok

我正在尝试为我的日志文件编写grok模式,它有三种不同类型的日志,我想在类型名称(TYPE1,TYPE2,TYPE3)上放置一个过滤器,然后为这一个日志写入三种不同的grok模式文件。 此外,我的日志文件是一个csv分隔文件。

日志文件:
TYPE1,字,词,词,NUM
TYPE2,字,词,字,词
TYPE3,num,word,num,word

这是我到目前为止所尝试的内容:

filter {
if [message] =~ /TYPE1/ {
grok {
    match => [ "message", "%{WORD:type},%{WORD:a1"},%{WORD:a2"},%{WORD:a3"},%{POSINT:a4"}]
     }
   }
}

这不起作用。 此外,在这个配置文件中,我为其他文件(运行良好)编写了grok模式,如:

filter {
    if [type] == "sometype1" or [type] == "sometype2" {
    grok {
    match => [ "message",  "%{POSINT:moduleid}%{SPACE}%{NUMBER:date}"]
         }
      }
   }

给我问题的日志文件有type = sometype3,我没有在任何地方提到过。

由于

3 个答案:

答案 0 :(得分:4)

我认为你不需要有条件的去做。如果您有静态 TYPE 值(" TYPE1" " TYPE2" & #34; TYPE3" )那么为什么不为每个 TYPE 指定一个grok模式:

filter { 
    grok {
        match => { "message" => [ 
                "TYPE1,%{WORD:a1},%{WORD:a2},%{WORD:a3},%{POSINT:a4}",
                "TYPE2,%{WORD:b1},%{WORD:b2},%{WORD:b3},%{WORD:b4}",
                "TYPE3,%{POSINT:c1},%{WORD:c2},%{POSINT:c3},%{WORD:c4}"  ]
            }
    }
} 

我已经尝试过了,它适用于您指定的格式:

TYPE1,word,word,word,num
TYPE2,word,word,word,word
TYPE3,num,word,num,word

日志文件如下所示:

TYPE1,a,b,c,4
TYPE2,a,b,c,d
TYPE3,1,b,3,d

答案 1 :(得分:1)

从成功追求一种类型开始,例如:

filter {
  if [type] == "sometype1" {
    grok {
      match => [ "message", "%{WORD:type",%{WORD:abc"}]
    }
  }
}

如果失败,您要么在日志数据中没有具有适当值的类型字段,要么您的格鲁克模式不正确。

使用grok debugger

进行验证

如果你设法解析了一种类型,现在尝试通过添加

来添加其他类型
if [type] == "sometype1" or [type] == "sometype2" or [type] == "sometype3"

替代方案可以是

if [type] == "sometype1" {

}
else if [type] == "sometype2" {

}

答案 2 :(得分:1)

在您的示例中,您使用正则表达式来查看是否应该运行正则表达式。这太多了。

以下是两个想法:

首先,使用grok将第一个单词拉入变量并将其余信息放回消息中:

"%{WORD:myType},%{GREEDYDATA:message}"

(您需要在该配置中使用overwrite。)

然后,您可以使用精确条件来确定要使用的后续grok模式:

if [myType] == "type1" {
}
...

其次,也可以在一个grok表达式中列出多个模式:

match => [ "message", "pattern1", "pattern2", "pattern3" ]

但这也很贵! (检查文档的语法以确定!)。