[英]Parsing log data throught grok filter (logstash)
我对 ELK 很陌生,我正在尝试通过 logstash 解析我的日志。 日志由 filebeat 发送。
日志看起来像:
2019.12.02 16:21:54.330536 [ 1 ] {} <Information> Application: starting up
2020.03.21 13:14:54.941405 [ 28 ] {xxx23xx-xxx23xx-4f0e-a3c6-rge3gu1} <Debug> executeQuery: (from [::ffff:192.0.0.0]:9999) blahblahblah
2020.03.21 13:14:54.941469 [ 28 ] {xxx23xx-xxx23xx-4f0e-a3c6-rge3gu0} <Error> executeQuery: Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 1
我的默认logstash配置是:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
在我的日志示例中,我提取如下字段:时间戳代码 pipelineId logLevel 程序消息。
但是我的 grok 模式有几个问题。 首先,日志上的时间戳与经典时间戳完全不同。 我怎样才能得到它的认可? 当 {} 可以为空或不为空时,我也遇到了问题。 你能给我一些关于什么应该是正确的grok模式的建议吗?
此外,在 Kibana 中,我有很多信息,例如主机名、操作系统详细信息、代理详细信息、来源等。我读过这些字段是 ES 元数据,因此无法删除它们。 我发现它有很多信息,有没有办法“隐藏”这些?
在下面的屏幕截图中,您可以看到我为您的示例日志构建的模式(在Grok Debugger中):
这是你要找的结果吗?
# logstash.conf
…
filter {
grok {
patterns_dir => ["./patterns"]
match => {
"message" => "%{CUSTOM_DATE:timestamp}\s\[\s%{BASE10NUM:code}\s\]\s\{%{GREEDYDATA:pipeline_id}\}\s\<%{GREEDYDATA:log_level}\>\s%{GREEDYDATA:program_message}"
}
}
}
…
如您所见,我告诉 grok 在patterns
目录中查找我的自定义模式,我将其放在与我的logstash.conf
文件相同的位置。 在此目录中,我创建了包含以下内容的custom.txt
文件:
# patterns/custom.txt
CUSTOM_DATE (?>\d\d){1,2}\.(?:0?[1-9]|1[0-2])\.(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])\s(?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])
这么长的图案不是我自己写的。 我从这一行开始:
CUSTOM_DATE %{YEAR}\.%{MONTHNUM}\.%{MONTHDAY}\s%{TIME}
然后,我用相应的正则表达式替换了每个预定义的模式(一个接一个,直接在 Grok 调试器中)。 您可以在应用程序中使用%{YEAR}\.%{MONTHNUM}\.%{MONTHDAY}\s%{TIME}
,但 Grok 调试器界面将分别打印每个部分。
如果pipeline_id
字段为空,我不知道你想做什么。 如果要完全删除它,可以尝试将以下行添加到配置中:
# logstash.conf
…
filter {
grok {
…
}
if [pipeline_id] == "" {
mutate {
remove_field => ["pipeline_id"]
}
}
}
…
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.