Promtail 错误管道阶段只能包含一个密钥



尝试设置Promtail时,出现以下错误:

级别=错误 ts=2020-11-27T06:10:30.310583Z 调用者=main.go:104 msg="创建 promtail 时出错" 错误="无法创建文件目标管理器:管道阶段必须仅包含一个密钥">

我正在从命令行运行以下内容。

promtail-windows-amd64.exe --config.file=../conf/promtail-local-config.yml

我的日志行如下所示:

13:

21:03.183 - INFO - 已成功从"127.0.0.1"接收文档。在 102 毫秒内从地址"/127.0.0.1"保存为"c:\test\test_file.txt">

13:21:05.275 - 警告 - 无法从"127.0.0.1"接收文档。创建文件 c:\test\error_file.txt' 时出错

我的配置如下所示:

scrape_configs:
- job_name: promtailTest
pipeline_stages:
- match:
selector: '{job="promtailTest"}'
stages:
- regex:
expression: '^(?P<timestamp>\d{2}:\d{2}:\d{2}\.\d{3})\s\-\s(?P<logLevel>[A-Z]{4,5})\s\-\s(?P<logMessage>.*)$'
- labels:
logLevel:
static_configs:
- targets:
- localhost
labels:
job: promtailTest
app: promtailTest
host: LOCAL
__path__: C:/test/logs/*log

当我取出pipeline_stages:部分时,我确实看到了 grafana 中的行,但我无法让正则表达式部分工作。 我实际上想为日志记录级别添加一个标签(这样我就可以计算错误)

呸!!我是个傻瓜。 我认为问题出在我的格式上(YAML 可以是真正的 PITA!!)

我的新配置现在看起来像这样并且可以工作。

scrape_configs:
- job_name: promtailTest
static_configs:
- targets:
- localhost
labels:
job: promtailTest
app: promtailTest
host: APOLLO99
__path__: D:/SXI/XPress/Dispatch/logs/*log
pipeline_stages:
- match:
selector: '{job="promtailTest"}'
stages:
- regex:
expression: "^^(?P<myTime>\d{2}:\d{2}:\d{2}\.\d{3})\s\-\s(?P<logLevel>[A-Z]{4,5})\s\-\s(?P<logMessage>.*)$$"
- labels:
logLevel:

我一直在与这个错误作斗争,即使接受的答案是正确的,我也不清楚错误在哪里。

正如许多人所说,问题出在缩进上,而YAML的事实非常令人困惑。

如果比较问题中的 YAML 和答案中的 YAML,您会发现- match:下的所有内容都缩进了正确答案中的两个额外空格。- regex:- labels之后的行也会发生同样的情况。这两个额外的空格很重要,因为否则matchselector将处于同一级别(它们应该是一个在另一个内部)。

当您将其转换为 JSON 时,一切都变得清晰起来。

这是转换为 JSON 的问题的 YAML:

{
"pipeline_stages": [
{
"match": null,
"selector": "{job="promtailTest"}",
"stages": [
{
"regex": null,
"expression": "^(?P<timestamp>\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\s\\-\\s(?P<logLevel>[A-Z]{4,5})\\s\\-\\s(?P<logMessage>.*)$"
},
{
"labels": null,
"logLevel": null
}
]
}
]
}

如您所见,pipeline_stages是一个数组,其中第一项有 3 个键(在同一级别):matchselectorstages。Promtail 期望这里只有 1 个密钥(match),这就是为什么它说"管道阶段必须只包含一个密钥"。

这是转换为 JSON 的正确答案:

{
"pipeline_stages": [
{
"match": {
"selector": "{job="promtailTest"}",
"stages": [
{
"regex": {
"expression": "^^(?P<myTime>\d{2}:\d{2}:\d{2}\.\d{3})\s\-\s(?P<logLevel>[A-Z]{4,5})\s\-\s(?P<logMessage>.*)$$"
}
},
{
"labels": {
"logLevel": null
}
}
]
}
}
]
}

现在pipeline_stages也是一个数组,但第一项只有一个键match这是 Promtail 所期望的。现在selectorstages都在match内.

最新更新