这是我尝试过滤的日志示例行:
Request starting HTTP/1.1 GET http://api0.api.sin/api/social/v1/owner/4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf/feeds/notifications/unread/count
我期望的结果如下: {
"message": [
[
"Request starting"
]
],
"httpversion": [
[
"1.1"
]
],
"BASE10NUM": [
[
"1.1"
]
],
"verb": [
[
"GET"
]
],
"request": [
[
"http://api0.api.sin/api/social/v1/owner/feeds/notifications/unread/count"
]
],
"uuid": [
[
"4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf"
]
]
}
我尝试使用下面的grok表达式,但是请求以2个单独的值返回。%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request}%{UUID:uuid}%{NOTSPACE:request}
最佳答案
您可以将UUID之前和之后的部分捕获到单独的组中,然后可以将两个值组合到一个字段中:
grok {
match => {
"message" => "%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request1}/%{UUID:uuid}%{NOTSPACE:request2}"
}
}
mutate {
add_field => {
"request" => "%{request1}%{request2}"
}
}
如果愿意,您也可以稍后删除request1
和request2
。如果您不能使用
mutate
,则只能提出一个其中request
包含UUID的表达式:%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} (?<request>.*?(?<UUID>[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})\S*)
因为不能将两个不相交的文本字符串匹配到一个捕获组中。
关于regex - 使用Grok从路径字符串中过滤掉UUID并返回路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62838726/