Regex、Grafana Loki、Promtail:使用正则表达式从日志中解析时间戳

Regex, Grafana Loki, Promtail: Parsing a timestamp from logs using regex

我想从日志中解析一个时间戳,供 lo​​ki 用作时间戳。
说到正则表达式,我完全是菜鸟。

日志文件来自“endlessh”,它本质上是针对 ssh 攻击者的 tarpit/honeypit。

看起来像这样:

2022-04-03 14:37:25.101991388  2022-04-03T12:37:25.101Z CLOSE host=::ffff:218.92.0.192 port=21590 fd=4 time=20.015 bytes=26
2022-04-03 14:38:07.723962122  2022-04-03T12:38:07.723Z ACCEPT host=::ffff:218.92.0.192 port=64475 fd=4 n=1/4096

我想要使用正则表达式匹配的是那里存在的第二个时间戳,因为它是一个 utc 时间戳,应该可以被 promtail 解析。

我尝试了不同的方法,但根本无法正确处理。

所以首先我需要一个匹配我想要的时间戳的正则表达式。
但其次,我需要以某种方式将其形成一个正则表达式,以某种方式公开值? 文档提供了这个例子:

.*level=(?P<level>[a-zA-Z]+).*ts=(?P<timestamp>[T\d-:.Z]*).*component=(?P<component>[a-zA-Z]+)

Afaik,这些是命名组,这就是为我在配置中使用它公开值所需的全部内容?

如果有人能提供正则表达式的解决方案,并解释它的作用,那就太好了:)

例如,您可以创建特定模式来匹配第一部分,并捕获第二部分:

^\d{4}-\d{2}-\d{2} \d\d:\d\d:\d\d\.\d+\s+(?P<timestamp>\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d\.\d+Z)\b

Regex demo

或者如果格式始终相同,则使用非常广泛的方法,重复一定数量的非空白字符部分并捕获您想要保留的部分。

^(?:\S+\s+){2}(?<timestamp>\S+)

Regex demo