簡単ログ基盤
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は次のような感じです。
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は下記のような感じです。
<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