用于 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}
正在努力将我们的 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}