dockerのnginxのコンテナのログをFilebeat 7.8でElasticsearchに送りたい

2日前に書いたこれ。

参考にしたサイトの情報が古かったようで、

filebeat.autodiscover:
 providers:
   - type: docker
     templates:
       - condition:
         contains:
           docker.container.image: nginx
         config:
           - module: nginx
             access:
               input:
                 type: docker
                 containers.ids:
                   - "${data.docker.container.id}"
             error:
               input:
                 type: docker
                 containers.ids:
                   - "${data.docker.container.id}"

この type: docker というのは古いようで...

WARN [cfgwarn] docker/input.go:49 DEPRECATED: 'docker' input deprecated. Use 'container' input instead. Will be removed in version: 8.0.0

などと警告が表示されていた。さらに悪いことに container.image が "nginx" を含んでいないログまで filebeat-7.8.0-nginx-access-pipeline に送られていた。


それで調べて書き直した結果。

filebeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:
            contains:
              docker.container.image: app
          config:
            - type: container
              paths: ["/var/lib/docker/containers/${data.docker.container.id}/*-json.log"]
        - condition:
          contains:
            docker.container.image: nginx
          config:
            - module: nginx
              access.input:
                type: container
                stream: stdout
                paths: ["/var/lib/docker/containers/${data.docker.container.id}/*-json.log"]
              error.input:
                type: container
                stream: stderr
                paths: ["/var/lib/docker/containers/${data.docker.container.id}/*-json.log"]

これでコンテナ名に "nginx" を含むコンテナのアクセスログ(stdoutで出力される)は filebeat-7.8.0-nginx-access-pipeline へ、エラーログ(stderrで出力される)は filebeat-7.8.0-nginx-error-pipeline へ、コンテナ名に "app" を含むものは、どのパイプラインも通さないという動作になった。