我正在一个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}"
}
}
}