日志文件中不同类型日志的 Grok 模式
Grok pattern for different types of log in a logfile
我正在尝试为我的日志文件编写 grok 模式,它包含三种不同类型的日志,我想对类型名称(TYPE1、TYPE2、TYPE3)进行过滤,然后为此编写三种不同的 grok 模式一个日志文件。
另外,我的日志文件是一个 csv 分隔文件。
日志文件:
TYPE1,word,word,word,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 ,我在任何地方都没有提到。
谢谢
从成功追求一种开始,例如:
filter {
if [type] == "sometype1" {
grok {
match => [ "message", "%{WORD:type",%{WORD:abc"}]
}
}
}
如果失败,您要么在日志数据中没有具有适当值的类型字段,要么您的 grok 模式不正确。
验证
如果您现在设法解析一种类型,请尝试通过添加
来添加其他类型
if [type] == "sometype1" or [type] == "sometype2" or [type] == "sometype3"
替代方案可以是
if [type] == "sometype1" {
}
else if [type] == "sometype2" {
}
在您的示例中,您使用正则表达式来查看是否应该 运行 正则表达式。开销太大了。
这里有两个想法:
首先,使用 grok 将第一个单词提取到一个变量中,并将其余信息放回消息中:
"%{WORD:myType},%{GREEDYDATA:message}"
(您需要在该配置中使用 overwrite
)。
然后您可以使用精确的条件来确定要使用的后续 grok 模式:
if [myType] == "type1" {
}
...
其次,也可以在一个 grok 表达式中列出多个模式:
match => [ "message", "pattern1", "pattern2", "pattern3" ]
但这也很贵! (检查文档的语法以确保!)。
我认为您不需要条件来做到这一点。如果您有静态 TYPE 值("TYPE1"、"TYPE2" 或 "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
我正在尝试为我的日志文件编写 grok 模式,它包含三种不同类型的日志,我想对类型名称(TYPE1、TYPE2、TYPE3)进行过滤,然后为此编写三种不同的 grok 模式一个日志文件。 另外,我的日志文件是一个 csv 分隔文件。
日志文件:
TYPE1,word,word,word,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 ,我在任何地方都没有提到。
谢谢
从成功追求一种开始,例如:
filter {
if [type] == "sometype1" {
grok {
match => [ "message", "%{WORD:type",%{WORD:abc"}]
}
}
}
如果失败,您要么在日志数据中没有具有适当值的类型字段,要么您的 grok 模式不正确。
验证如果您现在设法解析一种类型,请尝试通过添加
来添加其他类型if [type] == "sometype1" or [type] == "sometype2" or [type] == "sometype3"
替代方案可以是
if [type] == "sometype1" {
}
else if [type] == "sometype2" {
}
在您的示例中,您使用正则表达式来查看是否应该 运行 正则表达式。开销太大了。
这里有两个想法:
首先,使用 grok 将第一个单词提取到一个变量中,并将其余信息放回消息中:
"%{WORD:myType},%{GREEDYDATA:message}"
(您需要在该配置中使用 overwrite
)。
然后您可以使用精确的条件来确定要使用的后续 grok 模式:
if [myType] == "type1" {
}
...
其次,也可以在一个 grok 表达式中列出多个模式:
match => [ "message", "pattern1", "pattern2", "pattern3" ]
但这也很贵! (检查文档的语法以确保!)。
我认为您不需要条件来做到这一点。如果您有静态 TYPE 值("TYPE1"、"TYPE2" 或 "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