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