我正在使用filebeat将日志发送到logstash,但我在Logstash上遇到了grok语法问题。我使用了Kibanna和Manager上的Grok调试器来解决问题。问题是我找不到Logstash相同的语法。
原始日志:
{"log":"188.188.188.188 - tgaro [22/Aug/2022:11:37:54 +0200] \"PROPFIND /remote.php/dav/files/xxx@yyyy.com/ HTTP/1.1\" 207 1035 \"-\" \"Mozilla/5.0 (Windows) mirall/2.6.1stable-Win64 (build 20191105) (Nextcloud)\"\n","stream":"stdout","time":"2022-08-22T09:37:54.782377901Z"}
字符串
Logstash中接收的消息:
"message" => "{\"log\":\"188.188.188.188 - tgaro [22/Aug/2022:11:37:54 +0200] \\\"PROPFIND /remote.php/dav/files/xxx@yyyy.com/ HTTP/1.1\\\" 207 1035 \\\"-\\\" \\\"Mozilla/5.0 (Windows) mirall/2.6.1stable-Win64 (build 20191105) (Nextcloud)\\\"\\n\",\"stream\":\"stdout\",\"time\":\"2022-08-22T09:37:54.782377901Z\"}",
型
我在Grok Debugger(Kibana)上使用的Grok Pattern:
{\\"log\\":\\"%{IPORHOST:clientip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] \\\\\\"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\\\\\\" (?:-|%{NUMBER:response}) (?:-|%{NUMBER:bytes}) \\\\\\("%{DATA:referrer}\\\\\\") \\\\\\"%{DATA:user-agent}\\\\\\"
型
真实的的问题是,我甚至不能设法获得IP(188.188.188.188)。我试过:
match => { "message" => '{\\"log\\":\\"%{IPORHOST:clientip}' # backslash to escape the backslash
match => { "message" => '{\\\"log\\\":\\\"%{IPORHOST:clientip}' # backslash to escape the quote
match => { "message" => "{\\\"log\\\":\\\"%{IPORHOST:clientip}" # backslash to escape the quote
型
这里使用的日志是收缩的。真实的的日志与JSON和字符串混合在一起,所以我不能在Filebeat中将其作为JSON发送。
2条答案
按热度按时间2ekbmq321#
您已经使用JSON Filter过滤掉JSON,并尝试使用GROK Filter匹配
jsonMessage
我使用GROK Debugger创建了一个匹配
jsonMessage
字段的grok模式。在上面的日志示例中使用JSON过滤器后,我假设的
jsonMessage
是:188.188.188.188 - user.name@things.com [23/Aug/2022:23:59:52 +0200] \\"PROPFIND /remote.php/dav/files/ HTTP/1.1\\" 207 1159 \\"-\\" \\"Mozilla/5.0 (Linux) mirall/3.4.2-1ubuntu1 (Nextcloud, ubuntu-5.15.0-46-generic ClientArchitecture: x86_64 OsArchitecture: x86_64)\\"\\n"
个以下是将工作的模式:
%{IPORHOST:clientip} %{USER:ident} %{DATA:auth} \[%{HTTPDATE:timestamp}\] \\\\"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) \\\\"
的数据
输出屏幕截图:
的
注:如果您想将
rawrequest
字段值扩展到单个字段,也可以这样做。2q5ifsrm2#
好的,我通过使用这个来使它工作:
字符串
日志如下:
型
第一个匹配将获取前3个字段(时间、主机名和标签),然后获取jsonMessage中
GREEDYDATA
模式下:
之后的所有内容。然后在jsonMessage上使用json过滤器。从那时起,我们在使用json过滤器创建的新字段日志中获得了所需的信息。我仍然不明白为什么我的grok在Kibanna调试器上工作,而不是在Logstash上。我的意思是,这可能是因为一些字符需要被转义。但即使我逃离他们,它也没有工作。