前回、 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 モジュールを使って処理する
これなら自分でヘンな作り込みしなくても簡単にログを送って、ちゃんとインデックスもつくので楽ですな。