如何使用promtail取消多行Java日志?

时间:2020-08-23 11:58:53

标签: multiline loki

  1. 这是Som Java日志
2020-08-21 19:55:44-[audit]-INFO[http-nio-8001-exec-10]BeetlsqlDebugInterceptor.println(20) |
┏━━━━━ Debug [conclusionOperator.selectConclusionOperator] ━━━
┣ SQL:   select id,create_time,update_time from conclusion_operator where id=?
┣ PARAMETERS:         [751]
┣ POSITION:                org.aaaa.audit.controller.MailController.getElecMail(MailController.java:584)
┣ TIME:                        3ms
┣ RESULT:                   [2]
┗━━━━━ Debug [conclusionOperator.selectConclusionOperator] ━━━

这8行实际上是一个日志事件,如何配置Promtail以将此行作为一个日志事件报废?更喜欢您的pipeline_stages!非常感谢!

2 个答案:

答案 0 :(得分:0)

如果您使用Logback作为日志记录框架,请考虑切换到直接写入Loki的附加程序:https://github.com/loki4j/loki-logback-appender(披露:我是它的作者)。

与Promtail不同,它与原始Logback的日志事件一起使用,不需要解析任何内容。因此,多行字符串,自定义标签等都没有问题。

答案 1 :(得分:0)

使用 Promtail <= 2.1 时不可能。您要么使用像@nehaev 这样直接发布到 loki 的框架,要么必须升级到 Loki 2.2

Loki < 2.2 的解决方法是在 json 或 logfmt 中编码您的多行日志语句(最好是后者,因为它在不解析的情况下可读性更好)。在这些编码中,新行由 \n 转义,对于 Promtail,它仍然是一行。

然后你会有一个像

这样的日志行
time="2020-08-21 19:55:44" msg="line1\nline2\nline3" level=INFO logger=audit ...

然后您可以使用以下查询找到并解析它

{app="someApp"} |= "..." | logfmt

Grafand 将解析日志行中的所有字段,如 level=INFO 另外它将消息转义为

line1
line2
line3

这种方法的好处是您可以添加元信息,例如关联 ID、交易 ID、租户/客户 ID,这些信息很容易找到,但仍可被 Grafana 解析。