我正在尝试为我的 Java 日志编写一个 logstash 过滤器,以便我可以将它们干净地插入我的数据库中。
以下是我的日志格式示例:
FINE 2016-01-28 22:20:42.614+0000 net.myorg.crypto.CryptoFactory:getInstance:73:v181328
AppName : MyApp AssocAppName:
Host : localhost 127.000.000.001 AssocHost:
Thread : http-bio-8080-exec-5[23]
SequenceId: -1
Logger : net.myorg.crypto.CryptoFactory
Message : ENTRY
---
FINE 2016-01-28 22:20:42.628+0000 net.myorg.crypto.CryptoFactory:getInstance:75:v181328
AppName : MyApp AssocAppName:
Host : localhost 127.000.000.001 AssocHost:
Thread : http-bio-8080-exec-5[23]
SequenceId: -1
Logger : net.myorg.crypto.CryptoFactory
Message : RETURN
---
我的日志转发器非常简单。 它只包含目录中的所有日志(它们都具有与上述相同的格式)
"files": [
{
"paths": [ "/opt/logs/*.log" ],
"fields": { "type": "javaLogs" }
}
]
我遇到的麻烦在日志方面。 如何在 logstash 中编写过滤器以匹配此日志格式?
使用这样的东西,让我接近:
filter {
if [type] == "javaLogs" {
multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
}
}
}
但是我想将日志中的每一行分解为logstash中自己的映射。 例如,创建AppName
、AssocHost
、Host
、Thread
等字段。
我认为答案是使用grok
.
使用多行(编解码器或过滤器,具体取决于您的需求)连接它们是很好的第一步。
不幸的是,您的模式显示"如果日志条目不以时间戳开头,请将其与上一个条目联接"。
请注意,所有日志条目都不以时间戳开头。