用于 Quarkus 日志中 Opentracing 的 Logstash Grok 过滤器

Logstash Grok Filter for Opentracing in Quarkus' log

正在努力将我们的 Quarkus 日志文件导入 elasticsearch。我的问题是尝试处理 logstash 中的日志...如何使用 grok 过滤器获取 traceId 和 spanId?

这是一个示例日志条目:

21:11:32 INFO  traceId=50a4f8740c30b9ca, spanId=50a4f8740c30b9ca, sampled=true [or.se.po.re.EmployeeResource] (vert.x-eventloop-thread-1) getEmployee with [id:2]

这是我的 grok:

%{TIME} %{LOGLEVEL} %{WORD:traceId} %{WORD:spanId} %{GREEDYDATA:msg}

使用 grok 调试器,似乎没有检测到 traceId 和 spanId。

问题可能有以下几点:

  • 字段之间的间距可能不对(尝试在 %{LOGLEVEL} 之后添加 \s?\t
  • %{WORD} 模式可能不会获取值,因为包含 =

类似这种模式的东西可以工作(您可能需要对其进行一些修改):

^%{TIME:time} %{LOGLEVEL:level}\s?(?:%{WORD:traceid}=%{WORD:traceid}), (?:%{WORD:spanid}=%{WORD:spanid}), (?:%{WORD:sampled}=%{WORD:sampled}) %{GREEDYDATA:msg}$

AFIK Grok 表达式需要与原文完全相同。因此,请尝试添加逗号、空格和事件所有您不想捕获的文本。例如traceId=

%{TIME} %{LOGLEVEL}  traceId=%{WORD:traceId}, spanId=%{WORD:spanId}, %{GREEDYDATA:msg}

这是 https://grokdebug.herokuapp.com/ 的输出,用于您的日志行和我的 grok 表达式建议。

{
  "TIME": [
    [
      "21:11:32"
    ]
  ],
  "HOUR": [
    [
      "21"
    ]
  ],
  "MINUTE": [
    [
      "11"
    ]
  ],
  "SECOND": [
    [
      "32"
    ]
  ],
  "LOGLEVEL": [
    [
      "INFO"
    ]
  ],
  "traceId": [
    [
      "50a4f8740c30b9ca"
    ]
  ],
  "spanId": [
    [
      "50a4f8740c30b9ca"
    ]
  ],
  "msg": [
    [
      "sampled=true [or.se.po.re.EmployeeResource] (vert.x-eventloop-thread-1) getEmployee with [id:2]"
    ]
  ]
}

正如其他用户所提到的,注意单词之间的空格很重要。例如,logLevel 和 traceId 之间有两个空格。您可以使用 s+ 正则表达式来忘记它们。但也许使用太多会对性能产生很大(而且不好)的影响。

%{TIME}\s+%{LOGLEVEL}\s+traceId=%{WORD:traceId},\s+spanId=%{WORD:spanId},\s+%{GREEDYDATA:msg}