【问题标题】:How to crawl nginx container logs via filebeat?如何通过filebeat抓取nginx容器日志?
【发布时间】:2020-03-19 03:08:44
【问题描述】:

问题陈述

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

...由于容器启动/停止,我们仍然需要不断地介入以找到正确的文件夹...我们将被困在重新配置 FileBeat 以抓取它们。

问题:那么如何重命名 docker 容器日志文件夹以给它们一个可预测的名称?

替代方案

以下是我已排除的某些其他方法,但可以随意不同。

设置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。但是,这些不是常规文件,而是某种指向std 流的软链接/管道。所以我觉得这种做法是无效的。

【问题讨论】:

    标签: docker nginx containers filebeat


    【解决方案1】:

    我认为您将手头的问题过于复杂化了。 Filebeat 已经有很多可配置的选项,你不需要像这样重新发明。

    我建议你只使用add_docker_metadata 处理器。这将为容器生成的每个日志附加有用的信息,例如imagecontainer name,然后可以由drop 处理器检查,您可以在此处设置条件,以便您只接受来自特定容器的日志。

    processors:
    - add_docker_metadata:
    - drop_event:
        when:
          not:
             regexp:
                docker.container.name: "^nginx"
    

    Adding Docker Metadata Documentation

    Filtering Using Drop Processor

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 2020-01-04
      • 2018-12-14
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多