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

前回、 Docker → Fluentd → Elasticsearch の流れでログを送ってみたけど、やっぱログはファイルとしてホストに保存しつつ、コピーを Elasticsearch にも送りたいと思うようになった。
いろんな方法があるみたいだけど、Filebeat が楽そうだった。


これ使うと簡単な設定で nginx のログを Elasticsearch に送って、pipelineでパースしてインデックスしてくれる。

- module: nginx
  access:
    enabled: true
    var.paths: ["/path/to/log/nginx/access.log*"]
  error:
    enabled: true
    var.paths: ["/path/to/log/nginx/error.log*"]

ただ、dockerのログは /var/lib/docker/container/{id}/{id}.json みたいなパスだし、中身がjsonになっているので、

var.paths: ["/var/lib/docker/container/*/*.json"]

みたいなことをしても、nginxのログとして扱われないので期待通りにパースしてくれない。
なので、以下のサイトに書かれてるようにする。

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}"

コンテナのイメージ名に "nginx" が含まれているものを nginx モジュールを使って処理する
これなら自分でヘンな作り込みしなくても簡単にログを送って、ちゃんとインデックスもつくので楽ですな。