EFK(Elasticsearch,Fluentd,Kibana)で簡単ログ基盤をdocker-compose使って立ち上げる


簡単ログ基盤

GoogleAnalytics一辺倒のWeb運用から自前のDWHなんかを立てる運用にWeb運用の主戦場が移り変わってきてると感じる今日このごろ。
Web界隈に生きるエンジニアとしてはログ基盤くらいちょろっと調達できなければいけません。
とはいえ何を使っていいのやらと悩むことも多いことでしょう。

勝手に鉄板構成

いろんな選択肢がある中から、下記の選定をしてしまうと楽な気がします。

  • ログ集める:Fluentd
  • ログためとく:Elasticsearch
  • ログ見る:Kibana

Elasticsearchはけしてためとくのが得意じゃないので、ちゃんとためておきたい場合はS3とかファイルとかに出しておきましょう。今回紹介するFluentdではファイルにも出力してるので安心してください。

本題

次のような感じで立ち上げられます。

$ git clone https://github.com/foursue/efk.git
$ cd efk
$ docker-compose up

暫く待って起動したら…http://localhost:5601/にアクセスしましょう
こんな画面が開きます。

あとは好きなようにFluentdにログを投げ込むもよし、Elasticsearchに直接ログを投げ込むもよしです。

解説

今回はdocker-composeでEFKを立ち上げています。
docker-compose.ymlは次のような感じです。

docker-compose.yml
fluentd:
  build: ./fluentd
  volumes:
    - ./log:/fluentd/log
    - ./fluentd/conf:/fluentd/etc
  links:
    - "elasticsearch"
  ports:
    - "24224:24224"
    - "24224:24224/udp"
elasticsearch:
  image: elasticsearch
  expose:
    - 9200
  ports:
    - "9200:9200"
kibana:
  image: kibana
  links:
    - "elasticsearch"
  ports:
    - "5601:5601"

この構成だと、ホストの外から直接Elasticsearchへログを投げ込むこともできますし、Fluentdコンテナに集約してからElasticsearchへ投げ込むこともできます。

fluentd

Fluentdのconfは下記のような感じです。

fluent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  type copy
  <store>
    type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix logstash
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 20
  </store>
  <store>
    type file
    path /fluentd/log/access_log
  </store>
</match>

dockerの内部名前解決のlinkを使ってelasticsearchのIPアドレスを解決して投げ込む構成です。いちおうaccess_logとして投げ込んでますが、このあたりは好きなようにすると良いです。
一応Elasticsearchに投げる他に「/fluentd/log/access_log」とかにも出力してます。これだと高負荷系チューニングがしんどくなるので慣れたら外してしまうかコンテナから出して考えましょう。

まとめ

ソースはすごい短いので、githubも御覧ください。
https://github.com/foursue/efk