0

我一直在努力让正则表达式字符串正常工作。Promtail 使用它来解析我的日志中的标签。我遇到的问题是它不能使用积极的前瞻(因为我认为 promtail 是用 go 编写的?)

无论如何,日志都是网络日志,这里有几个例子:

INFO:     172.0.0.1:0 - "POST /endpoint1/UNIQUE-ID?key=unique_value HTTP/1.1" 200 OK
INFO:     172.0.0.2:0 - "GET /endpoint/health HTTP/1.1" 200 OK
172.0.0.1:0 - - [04/Mar/2022:10:52:10 -0500] "GET /endpoint2/optimize HTTP/1.1" 200 271
INFO:     172.0.0.3:0 :0 - "GET /endpoint3?key=unique_value HTTP/1.1" 200 OK

另一件值得指出的是,这UNIQUE-ID将是一个 VIN ID(车辆识别号)

我要创建的组是:ip request endpoint status. 但是,由于端点 1UNIQUE_IDunique_values端点 1 和端点 3 中的所有端点,使用完整端点路径会导致 loki 中的流过多并且基本上会杀死它。

我的解决方案正则表达式如下所示:

(?P<ip>((?:[0-9]{1,3}\.){3}[0-9]{1,3})).+(?P<request>(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)).(?P<endpoint>(.+endpoint1\/health)|(.+endpoint1)|(.+)(\?)|(.+) ).+\".(?P<status>([0-9]{3}))

它捕获了以下组:

ip: `172.0.0.1`, `172.0.0.2`, `172.0.0.1` `172.0.0.3`
request: `POST`, `GET`, `GET`, `GET`
endpoint: `/endpoint1`, `/endpoint1/health`, `/endpoint2/optimize `, `/endpoint3?`
status: `200`,`200`,`200`,`200`

问题是 和 的/endpoint2/optimize 端点/endpoint3?。endpoint2 末尾有一个尾随空格,endpoint3 包含?. 我能够通过以下正则表达式使用积极的前瞻来完成这项工作,但它会在 Promtail 中引发错误。

(?P<ip>((?:[0-9]{1,3}\.){3}[0-9]{1,3})).+(?P<request>(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)).(?P<endpoint>(.+endpoint1\/health)|(.+endpoint1)|(.+)(?=\?)|(.+)(?= )).+\".(?P<status>([0-9]{3}))

任何帮助将不胜感激!我远不是假装我知道我的正则表达式...

编辑:这是一个例子https://regex101.com/r/FXvnqR/1

4

1 回答 1

1

编辑

试试这个!(?P<ip>((?:[0-9]{1,3}\.){3}[0-9]{1,3})).+(?P<request>(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)).(?P<endpoint>(/endpoint[1-3]?(?:\/health|\/optimize)?))?.+\".(?P<status>([0-9]{3}))

https://regex101.com/r/DKqRpL/1

如果将有端点包含 1-3 以外的数字或后续路由而不是运行状况或优化,则需要对其进行编辑,但到目前为止,这是您的解决方案

于 2022-03-04T20:49:13.560 回答