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
我想为部署的每个 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