有一个键值对作为logstash输出,只使用grok过滤器



我正在一个spring引导项目上工作,并使用ELK堆栈进行日志记录和审计。我需要一个logstash.conf文件,它将处理日志和输出可以有动态键值对。此输出数据将用于审计。

添加一个示例以便更清晰

例子:

示例日志:

[INFO] [3b1d04f219fc43d18ccb6cb22db6cff4] 2021-10-13_13:43:09.074 Audit_ key1:value1| key2:value2| key3:value3| keyN:valueN

需要的日志存储输出:

{
"logLevel": [
[
"INFO"
]
],
"threadId": [
[
"3b1d04f219fc43d18ccb6cb22db6cff4"
]
],
"timeStamp": [
[
"2021-10-13_13:43:09.074"
]
],
"class": [
[
"Audit_"
]
],
"key1": [
[
"value1"
]
],
"key2": [
[
"value2"
]
],
"key3": [
[
"value3"
]
],
"keyN": [
[
"valueN"
]
]
}

注意:

  • "key"将始终是一个字或字符串值
  • "value"可以是单词、数字或句子(带空格的字符串)
  • ":";是键和值之间的分隔符
  • "|";是键值对之间的分隔符
  • 键值对的个数可以变化

有人可以建议/帮助我与匹配模式在这里使用?我只允许使用grok过滤器。

感谢Filip和leandrojmp的指导!

只使用grok过滤器,会使它变得非常复杂,而且它不支持动态键值对。

所以我用了grok和kv滤波器的组合。这种方法对我很有效。

示例日志:

[INFO] [3b1d04f219fc43d18ccb6cb22db6cff4] 2021-10-13_13:43:09.074 _Audit_ key1:value1| key2:value2| key3:value3| keyN:valueN

logstash.conf文件:

input {
beats {
port => "5044"
}
}
filter {
grok {
match => {"message" => "[%{LOGLEVEL:logLevel}] [%{WORD:traceId}] (?<timestamp>[0-9-_:.]*) %{WORD:class} %{GREEDYDATA:message}"]}
overwrite => [ "message" ]
}
if [class] == "_Audit_" {
kv {
source => "message"
field_split => "&"
value_split => "="
remove_field => ["message"]
}
}
}
output {
if [class] == "_Audit_" {
elasticsearch { 
hosts => ["localhost:9200"] 
index => "audit-logs-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch { 
hosts => ["localhost:9200"] 
index => "normal-logs-%{+YYYY.MM.dd}"
}
}
}