首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Logstash - Grok语法问题

Logstash - Grok语法问题
EN

Stack Overflow用户
提问于 2022-08-24 09:30:11
回答 2查看 33关注 0票数 0

我使用file节拍将日志发送到Logstash,但是logstash上的grok语法出现了问题。我在Kibanna和经理上使用了grok调试器来找到解决方案。问题是我找不到Logstash的相同语法。

原始日志:

代码语言:javascript
运行
复制
{"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中的消息接收:

代码语言:javascript
运行
复制
"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模式:

代码语言:javascript
运行
复制
{\\"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)。我试过:

代码语言:javascript
运行
复制
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

非常感谢您的帮助!

ps :这里使用的日志是收缩的。真正的日志与Json和string混合在一起,所以我不能将它作为Json在File节拍中发送。

EN

回答 2

Stack Overflow用户

发布于 2022-08-24 14:24:35

好的,所以我设法通过以下方法使它工作:

代码语言:javascript
运行
复制
     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}\\"'}
                
        }

使用这样的日志:

代码语言:javascript
运行
复制
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过滤器创建的新字段日志中获得了所需的信息。

我仍然不明白为什么我的摸索工作在Kibanna调试器上,而不是在Logstash上。我是说,这可能是因为某个角色需要逃脱。但即使我逃了出来也没用。

票数 0
EN

Stack Overflow用户

发布于 2022-08-28 15:28:42

@RaiZy_Style已经使用JSON过滤器过滤掉了JSON,并试图使用GROK Filter来匹配jsonMessage

我使用格罗克调试器创建了一个匹配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字段值展开为单个字段,也可以这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73470733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档