在 Loki 中删除部分日志

Remove a part of a log in Loki

我已经使用 grafana/loki-stack.

安装了 Grafana、Loki、Promtail 和 Prometheus

我还使用 Nginx helm chart.

设置了 Nginx

Promtail 正在将日志很好地摄取到 Loki 中,但我想自定义日志的外观。具体来说,我想删除日志的一部分,因为它在尝试使用 logfmtjson(分别为 Error: LogfmtParserErrError: JsonParserErr)解析它时会产生错误。

日志如下所示:

2022-02-21T13:41:53.155640208Z stdout F timestamp=2022-02-21T13:41:53+00:00 http_request_method=POST http_response_status_code=200 http_response_time=0.001 http_version=HTTP/2.0 http_request_body_bytes=0 http_request_bytes=63

我想删除 stdout F 的部分,这样日志将如下所示:

2022-02-21T13:41:53.155640208Z timestamp=2022-02-21T13:41:53+00:00 http_request_method=POST http_response_status_code=200 http_response_time=0.001 http_version=HTTP/2.0 http_request_body_bytes=0 http_request_bytes=63

我发现在摄取方面它可能与 Promtail 相关,但是否也可以在 Loki 中进行 LogQL 查询以仅替换该字符串?以及如何为所需的行为设置 Promtail 配置?

Promtail 应配置为用 replace stage.

替换字符串

这是一个示例配置,它删除了来自命名空间 ingress.

的所有日志的日志的 stdout F 部分
promtail:
  enabled: true
  pipelineStages:
  - docker: {}
  - match:
      selector: '{namespace="ingress"}'
      stages:
      - replace:
          expression: "(stdout F)"
          replace: ""

这个例子特别适用于 grafana/loki-stack 图表。

根据文档,更好的方法是启用 cri 管道阶段而不是 docker 阶段。假设您正在从最近使用 CRI 的 kubernetes 安装中获取日志。

https://grafana.com/docs/loki/latest/clients/promtail/configuration/#cri