Filebeat 多行模式

Filebeat multiline patter

我想为部署的每个 docker 容器配置一个多行模式。我知道我可以配置不同的 filebeat 输入,但问题是我不知道我使用的是哪个容器,因为容器日志的路径类似于 /var/lib/docker/containers/{id}/[{id}.log

有什么想法吗?

您可以在 filebeat 配置中使用 glob-patterns:

这样的设置

/var/lib/docker/containers/*/*.log

应该匹配您要查找的任何文件吗?

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html#input-paths

请确保一个文件没有被多个路径设置匹配。

根据添加的要求在下面进行编辑。

例如,您将拥有这 2 个容器 运行ning:

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
77e87b8e772e        yadayada                                   "/hihihi"                 2 weeks ago        Up 19 seconds       0.0.0.0:9080->9080/tcp   container1
99e87b8e772e        blablabla                                  "/hahaha"                 2 weeks ago        Up 19 seconds       0.0.0.0:9080->9080/tcp   container2

根据提供的信息,假设是:

container1 登录 /var/lib/docker/containers/77e87b8e772e/77e87b8e772e.log
容器 2 登录 /var/lib/docker/containers/99e87b8e772e/99e87b8e772e.log

这可能是配置:

filebeat.inputs:
- type: log
  paths: /var/lib/docker/containers/${CONTAINERID1}/${CONTAINERID1}.log
  multiline.pattern: '^=[A-Z]+|^$'
  multiline.negate: true
  multiline.match: after
- type: log
  paths: /var/lib/docker/containers/${CONTAINERID2}/${CONTAINERID2}.log
  multiline.pattern: '^=[1-9]+|^$'
  multiline.negate: true
  multiline.match: after

因此,当启动 filebeat 时,您需要在实际 运行ning filebeat 之前做一些额外的事情:

export CONTAINERID1=$(docker ps|grep "container1$" | cut -d ' ' -f1)
export CONTAINERID2=$(docker ps|grep "container2$" | cut -d ' ' -f1)
./filebeat

这样,只要容器名称保持不变,ID 可以不同,仍然有效。请注意,当您启动一个新的(a 版本) 容器,您必须重新启动 Filebeat 才能选择新路径。

另请注意,如果您 运行 Filebeat 在 docker 容器本身中,则导出变量很可能是不够的,您必须使用以下命令编辑文件 sed 之类的东西,然后再将其传递到 filebeat-container