如何通过filebeat抓取nginx容器日志?
How to crawl nginx container logs via filebeat?
问题陈述
NGINX 映像默认配置为将主要的 NGINX 访问和错误日志发送到 Docker 日志收集器。这是通过将它们链接到 stdout 和 stderr 来完成的,这会导致来自两个日志的所有消息都存储在 Docker 主机上的文件 /var/lib/docker/containers/<container id>/<container id>-json.log
中。
既然我们已经完成了将日志从容器中取出并放入主机的艰苦工作,也许我们应该尝试利用它?但是/var/lib/docker/containers/
里面有很多难以区分的文件夹
# ls -alrt /var/lib/docker/containers/
total 84
drwx--x--x 14 root root 4096 Jul 4 13:40 ..
drwx------ 4 root root 4096 Jul 4 13:55 a4ee4224c3e4c68a8023eb63c01b2a288019257440b30c4efb7226eb83629956
drwx------ 4 root root 4096 Jul 6 16:24 59d1465b5c42f2ce6b13747c39ff3995191d325d641b6ef8cad1a8446247ef24
...
drwx------ 4 root root 4096 Jul 9 06:34 cab3407af18d778b259f54df16e60f5e5187f14b01a020b30f6c91c6f8003bdd
drwx------ 4 root root 4096 Jul 9 06:35 0b99140af456b29af6fcd3956a6cdfa4c78d1e1b387654645f63b8dc4bbf049c
drwx------ 21 root root 4096 Jul 9 06:35 .
即使我们 narrow them down 通过 /var/lib/docker/containers/
递归搜索任何类型为 -json.log
且包含字符串 upstream_response_time
的文件
# grep -lr "upstream_response_time" /var/lib/docker/containers/ --include "*-json.log"
/var/lib/docker/containers/cfe8...fe18/cfe8...fe18-json.log
/var/lib/docker/containers/c3c3...6662/c3c3...6662-json.log
... 仍然让我们处于一种情况,由于容器 starting/stopping 我们将不得不不断介入以找到正确的文件夹...我们将无法重新配置 FileBeat
以进行爬网他们。
Question: So how can the docker container log folders be renamed to give them a predictable name?
备选方案
以下是我排除的某些其他方法,但您可以随意改变。
设置 named volume
$ tree /var/lib/docker/volumes/*nginx-log-volume
/var/lib/docker/volumes/my_swarm_stack_nginx-log-volume
└── _data
├── access.log -> /dev/stdout
└── error.log -> /dev/stderr
命名卷作为 stack
名称和 named volume
名称的组合存在:my_swarm_stack_nginx-log-volume
。但是这些不是常规文件,而是某种 softlink/pipe 到 std
的流。所以我觉得这种做法是无效的。
我认为您将手头的问题复杂化了。 Filebeat 已经有很多可配置的选项,你不需要像这样重新发明东西。
我建议您只使用 add_docker_metadata
处理器。这将为容器生成的每个日志附加有用的信息,例如 image
& container name
,然后可以由 drop
处理器检查,您可以在此处设置条件,以便您只接受日志仅来自特定容器。
processors:
- add_docker_metadata:
- drop_event:
when:
not:
regexp:
docker.container.name: "^nginx"
问题陈述
NGINX 映像默认配置为将主要的 NGINX 访问和错误日志发送到 Docker 日志收集器。这是通过将它们链接到 stdout 和 stderr 来完成的,这会导致来自两个日志的所有消息都存储在 Docker 主机上的文件 /var/lib/docker/containers/<container id>/<container id>-json.log
中。
既然我们已经完成了将日志从容器中取出并放入主机的艰苦工作,也许我们应该尝试利用它?但是/var/lib/docker/containers/
# ls -alrt /var/lib/docker/containers/
total 84
drwx--x--x 14 root root 4096 Jul 4 13:40 ..
drwx------ 4 root root 4096 Jul 4 13:55 a4ee4224c3e4c68a8023eb63c01b2a288019257440b30c4efb7226eb83629956
drwx------ 4 root root 4096 Jul 6 16:24 59d1465b5c42f2ce6b13747c39ff3995191d325d641b6ef8cad1a8446247ef24
...
drwx------ 4 root root 4096 Jul 9 06:34 cab3407af18d778b259f54df16e60f5e5187f14b01a020b30f6c91c6f8003bdd
drwx------ 4 root root 4096 Jul 9 06:35 0b99140af456b29af6fcd3956a6cdfa4c78d1e1b387654645f63b8dc4bbf049c
drwx------ 21 root root 4096 Jul 9 06:35 .
即使我们 narrow them down 通过 /var/lib/docker/containers/
递归搜索任何类型为 -json.log
且包含字符串 upstream_response_time
# grep -lr "upstream_response_time" /var/lib/docker/containers/ --include "*-json.log"
/var/lib/docker/containers/cfe8...fe18/cfe8...fe18-json.log
/var/lib/docker/containers/c3c3...6662/c3c3...6662-json.log
... 仍然让我们处于一种情况,由于容器 starting/stopping 我们将不得不不断介入以找到正确的文件夹...我们将无法重新配置 FileBeat
以进行爬网他们。
Question: So how can the docker container log folders be renamed to give them a predictable name?
备选方案
以下是我排除的某些其他方法,但您可以随意改变。
设置 named volume
$ tree /var/lib/docker/volumes/*nginx-log-volume
/var/lib/docker/volumes/my_swarm_stack_nginx-log-volume
└── _data
├── access.log -> /dev/stdout
└── error.log -> /dev/stderr
命名卷作为 stack
名称和 named volume
名称的组合存在:my_swarm_stack_nginx-log-volume
。但是这些不是常规文件,而是某种 softlink/pipe 到 std
的流。所以我觉得这种做法是无效的。
我认为您将手头的问题复杂化了。 Filebeat 已经有很多可配置的选项,你不需要像这样重新发明东西。
我建议您只使用 add_docker_metadata
处理器。这将为容器生成的每个日志附加有用的信息,例如 image
& container name
,然后可以由 drop
处理器检查,您可以在此处设置条件,以便您只接受日志仅来自特定容器。
processors:
- add_docker_metadata:
- drop_event:
when:
not:
regexp:
docker.container.name: "^nginx"