とりあえずdocker-composeでEFK動かした時のメモ

初めてfluentd触った時設定ファイルのあれやこれやがちんぷんかんぷんだったのでメモっておきました。ほぼ自分用。

とりあえず何も考えずにここのサンプルを実行 docs.fluentd.org

このサンプルは何やってんのか

  • httpdのコンテナの出力をDockerのlogdriverを使ってfluentdに転送
  • fluentdでデータの整形をした後elasticsearchに転送
  • kibanaで可視化

fluent.confについて

# 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 fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>
  <store>
    @type stdout
  </store>
</match>

<source>

データの入力元

  • @type forward

  • port 24224

    • リッスンポート
  • bind 0.0.0.0

    • 入力を受け付ける送信元IP
    • 0.0.0.0なら全てのIPからの入力を受け付ける

<match>

データの解析・出力

  • 正規表現に合致するタグの入力に対して処理を行う
  • **.*ならピリオド1個を含むタグの入力ならどんなものでも処理する
  • ちなみにこのサンプルでsourceから渡されてくる入力のタグはhttpd.accessしかない(ここのタグ名は後述のlogdriverのオプションで設定している)

  • @type copy

    • 使用するfluentdの出力プラグインをここで指定する
    • @type copyout_copyプラグインを指定している
    • out_copyは出力先が複数ある場合に使う。最低でも一つの<store>ディレクティブを要する
    • 出力プラグインについてはここを参照

<store>

出力先の設定とか出力するデータのフォーマットを決める

  • @type elasticsearch

    • fluent-plugin-elasticsearchの使用
    • これはgem installで追加したプラグイン。fluentdに元から入ってない
  • host elasticsearch

  • port 9200

    • 出力先のポート
  • logstash_format true, logstash_prefix fluentd

    • elasticsearchに登録するドキュメントのindexの名前のプレフィックスをlogstashからfluentdに変更する
    • ちなみにデフォルトのindexはlogstash-2017.08.01みたいなものになるが、変更後はfluentd-2017.08.01になる
    • 「fluentd使うのにlogstash_◯◯なのか…」っていう違和感めっちゃ感じるけど大丈夫
  • logstash_dateformat %Y%m%d

    • indexの日付のフォーマットを変更する
    • logstash_prefix fluentdと組み合わせるとfluentd-20170801ってな感じの形式にできる
  • include_tag_key true, tag_key @log_name

    • tagkeyの追加と設定
    • サンプルではelasticsearchに登録されたドキュメントに"@log_name": "httpd.access"ってフィールドが追加されるはず
  • type_name access_log

    • ドキュメントのtypeの名前の設定
  • flush_interval 1s

    • 出力にどんだけの時間の間隔を空けるか

2つ目の<store>

elasticsearchの他に端末にもデータの出力を行うってわけ!

docker-compose.ymlのlogdriverについて

3行目〜

web:
    image: httpd
    ports:
      - "80:80"
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access
  • fluentdログドライバを使用している
    • ここから送出されるログデータはin_forwardで受け取れる。ってことはデータの形式としてはout_forwardのものと同じ?
  • fluentd-address
    • fluentdのアドレスとポート
    • 当たり前なんだけどfluentdのポートはpublishしてやる必要がある
  • tag httpd.access
    • fluentdのsourceのタグ名を設定する
    • ちなみにこいつを設定しないとタグ名がhttpdのコンテナのコンテナIDになってしまう↓ f:id:tckw_aya:20170829024122p:plain

まとめ

elasticsearchいいよねfluentdいいよねkibanaいいよねEFKいいよね。

そういえばRancherのCommunity Catalogを見てる時にSematext Docker Agenetってやつを見つけたんですが、あいつもlogstashとかfluentdみたいなことができるんですかね。

面白そうなので使ってみたいんですがググっても日本語のドキュメントが皆無でつらい。