正在将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。
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}
问题可能是以下几点:
- 字段之间的间距可能关闭(尝试添加
s?
或t
后%{LOGLEVEL}
) %{WORD}
模式可能因为包含=
而无法拾取该值
类似这样的模式可以工作(您可能需要对其进行一些修改):
^%{TIME:time} %{LOGLEVEL:level}s?(?:%{WORD:traceid}=%{WORD:traceid}), (?:%{WORD:spanid}=%{WORD:spanid}), (?:%{WORD:sampled}=%{WORD:sampled}) %{GREEDYDATA:msg}$