logstash Grok语法问题

5q4ezhmt  于 2023-08-01  发布在  Logstash
关注(0)|答案(2)|浏览(148)

我正在使用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发送。

2ekbmq32

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字段值扩展到单个字段,也可以这样做。

2q5ifsrm

2q5ifsrm2#

好的,我通过使用这个来使它工作:

grok {
                match => { "message" => '%{SYSLOGTIMESTAMP:syslog_timestamp} %{IPORHOST:syslog_server} %{WORD:syslog_tag}: %{GREEDYDATA:jsonMessage}' }
        }
     json {
                source => "jsonMessage"
        }
     grok {
                match => { "jsonMessage" => '%{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}\\"'}
                
        }

字符串
日志如下:

Aug 24 00:00:01 hostname containers: {"log":"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","stream":"stdout","time":"2022-08-23T21:59:52.612843092Z"}


第一个匹配将获取前3个字段(时间、主机名和标签),然后获取jsonMessage中GREEDYDATA模式下:之后的所有内容。然后在jsonMessage上使用json过滤器。从那时起,我们在使用json过滤器创建的新字段日志中获得了所需的信息。
我仍然不明白为什么我的grok在Kibanna调试器上工作,而不是在Logstash上。我的意思是,这可能是因为一些字符需要被转义。但即使我逃离他们,它也没有工作。

相关问题