使用 Graylog 提取器从消息中提取时间戳

Extract timestamp from message with Graylog extractor

背景

我正在尝试覆盖默认时间戳 Graylog 将消息本身中写入的时间分配给消息。

为了实现这一点,我阅读了官方文档:

https://docs.graylog.org/en/3.3/pages/extractors.html#the-standard-date-converter

但是我仍然无法正确设置时间戳。

消息

大多数消息的开头如下:

2021-02-14T06:07:58.521009+00:00 myApp00_rest_of_log

还有其他类型的消息不符合此标准,但这是针对后者的。

为了从消息中提取时间戳,我创建了以下提取器:

RegEx 做得很好,但它是杀死它的转换器。

问题

如您所见,我正在使用转换器:

yyyy-MM-ddTHH:mm:ss.S

这行不通。我还尝试了以下变体:

yyyy-MM-dd'T'HH:mm:ss.S
yyyy-MM-dd HH:mm:ss.S
yyyy-MM-dd'T'HH:mm:ss.SSSSSS
yyyy-MM-dd HH:mm:ss.SSSSSS
yyyy-MM-ddTHH:mm:ss.SSSSSS

此时您可能已经掌握了一些东西:

  1. 我有 2 个问题:中间的“T”字符和秒后的精度(有 6 个数字,而不是只有 3 个(\d{4}-\d{2}-\d {2}T\d{2}:\d{2}:\d{2}.\d{6}))
  2. 我完全迷路了,此时我只是在猜测随机组合

好的但有缺陷的解决方案

“OK”解决方案是使用“灵活日期”转换器,但是如果我这样做,我将失去秒后的精度(第 1 点中提到的那 6 位小数)。

对我来说不幸的是,我需要我的系统的精度,所以我不能只删除最后 6 位小数。

问题

  1. 如何修复我的转换器,使其能够以我需要的精度正确覆盖时间戳?

回答

在撰写本文时 post,Graylog 不支持时间戳中的微秒精度。

发生这种情况主要是因为 Graylog 使用 org.joda.time.DateTime 库,该库不支持时间戳的微秒精度。

目前有一个 Pull 请求来尝试修复此问题:

https://github.com/Graylog2/graylog2-server/pull/9642

但目前还不清楚这将在哪个版本的 Graylog 中实际发布。

有关该发现的更多信息,请随时查看发现该发现的官方论坛:

https://community.graylog.org/t/extract-timestamp-from-message/18819/4?u=fl4m3ph03n1x