Logstash 把少量的食物合二为一
我有下面的日志条目和grok模式 日志: 格罗克模式:Logstash 把少量的食物合二为一,logstash,logstash-grok,Logstash,Logstash Grok,我有下面的日志条目和grok模式 日志: 格罗克模式: grok { #grok general pattern match => { "message" => "%{TIMESTAMP_ISO8601:logdate}%{SPACE}\|%{SPACE}%{LOGLEVEL:level}%{SPACE}\|%{SPACE}%{DATA:thread}%{SPACE}\|%{SPACE}%{DATA:serviceName}%{SPACE}\|%{SPACE}%{DATA:bundl
grok {
#grok general pattern
match => {
"message" => "%{TIMESTAMP_ISO8601:logdate}%{SPACE}\|%{SPACE}%{LOGLEVEL:level}%{SPACE}\|%{SPACE}%{DATA:thread}%{SPACE}\|%{SPACE}%{DATA:serviceName}%{SPACE}\|%{SPACE}%{DATA:bundle}%{SPACE}\|%{SPACE}%{GREEDYDATA:logdetails}"
}
}
#Grok to get GUID
grok {
match => {
"logdetails" => "(?<=GUID:).%{DATA:guid}(?=\s)"
}
}
#Grok to get ChannelID
grok {
match => {
"logdetails" => "(?<=ChannelID:).%{DATA:channelID}(?=\s)"
}
}
#Grok to get ReferenceID
grok {
match => {
"logdetails" => "(?<=ReferenceID:).%{DATA:referenceID}(?=\s)"
}
}
grok{
#格罗克通用模式
匹配=>{
“消息”=>“%{TIMESTAMP_ISO8601:logdate}%{SPACE}\\\{SPACE}%{LOGLEVEL:level}%{SPACE}\\\{124;%{SPACE}%{DATA:thread}%{SPACE}\\\{SPACE}%{DATA:serviceName}%{SPACE SPACE}\\\\{SPACE SPACE}%{DATA:bundle}%{SPACE}%{SPACE}\\\\\{greedydydydedData:logdetails}”
}
}
#摸索获得GUID
格罗克{
匹配=>{
“logdetails”=>”(?最好了解您正在处理的日志类型,但当需要担心的类型太多时(但它们保持相同的格式),我会怎么做:
确定基本格式
将base之后的所有内容都视为“msg”或有效负载
使用要查找的字段解析有效负载
每个消息的基本格式为时间戳|日志级别|线程
:
LINE %{BASE}\s?\|\s?%{GREEDYDATA:msg}
# Patterns
BASE %{CUSTTIME:timestamp}\s?\|\s?%{WORD:loglevel}\s?\|\s?%{NONNEGINT:thread}
CUSTTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND},%{MILLI}
MILLI (?:([1-9][0-9]{0,2}|0))
然后,您只需在同一个模式文件中为要查找的字段添加模式,因为所有值都非常类似于key=value,而是使用冒号:
COMMAVALUE (\s?(.*?(?=\s\w+:|$))\s?)
# Fields
GUID GUID:%{COMMAVALUE:guid}
CHANNELID ChannelID:%{COMMAVALUE:channel_id}
REFERENCEID ReferenceID:%{COMMAVALUE:reference_id}
因此,您可以使用两个相邻的grok过滤器来执行此操作,一个用于提取msg
有效负载,另一个用于从所述msg提取字段
filter {
grok {
patterns_dir => "/etc/logstash/patterns"
match => { "message" => "%{LINE}" }
}
grok {
patterns_dir => "/etc/logstash/patterns"
break_on_match => false
match => [
"msg", "%{GUID}",
"msg", "%{CHANNELID}",
"msg", "%{REFERENCEID}"
]
}
}
output {
stdout { codec => "rubydebug" }
}
最好了解您正在处理的日志的类型,但是如果需要担心的类型太多(但它们的格式仍然相同),我会怎么做:
确定基本格式
将base之后的所有内容都视为“msg”或有效负载
使用要查找的字段解析有效负载
每个消息的基本格式为时间戳|日志级别|线程
:
LINE %{BASE}\s?\|\s?%{GREEDYDATA:msg}
# Patterns
BASE %{CUSTTIME:timestamp}\s?\|\s?%{WORD:loglevel}\s?\|\s?%{NONNEGINT:thread}
CUSTTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND},%{MILLI}
MILLI (?:([1-9][0-9]{0,2}|0))
然后,您只需在同一个模式文件中为要查找的字段添加模式,因为所有值都非常类似于key=value,而是使用冒号:
COMMAVALUE (\s?(.*?(?=\s\w+:|$))\s?)
# Fields
GUID GUID:%{COMMAVALUE:guid}
CHANNELID ChannelID:%{COMMAVALUE:channel_id}
REFERENCEID ReferenceID:%{COMMAVALUE:reference_id}
因此,您可以使用两个相邻的grok过滤器来执行此操作,一个用于提取msg
有效负载,另一个用于从所述msg提取字段
filter {
grok {
patterns_dir => "/etc/logstash/patterns"
match => { "message" => "%{LINE}" }
}
grok {
patterns_dir => "/etc/logstash/patterns"
break_on_match => false
match => [
"msg", "%{GUID}",
"msg", "%{CHANNELID}",
"msg", "%{REFERENCEID}"
]
}
}
output {
stdout { codec => "rubydebug" }
}