Juju-62q's blog

参加記録やメモ書き、思考のまとめをしています

fluentdを利用してログ収集を簡単にしよう!

f:id:Juju_62q:20180528150858p:plain

本記事はOthloBlogからの転載です。

おはこんばんちは!@ジュジュです!
今回のブログではRubyで書かれたログ収集の万能マンfluentdについて書こうかと思います。プラグインも含め開発者がほとんど日本人のソフトウェアです。なんだか誇らしいですね。

対象読者

  • ログ収集って面倒くさいよねって思っている人。
  • fluentdって聞いたことあるけどまだ使ったことがない人。
  • ログの収集をハンドリングしたいインフラエンジニア。

記事の内容

  • fluentdって何?っていう疑問に答えて行きます。
  • fluentdを実際に利用する例を挙げて行きます。
  • fluentdを利用することでどんなメリットが享受できるのかまとめて行きます。

今回のブログはこのLTに具体的な設定を加えたものでもありますので、ぜひ事前にご覧下さい!

fluentdとは

fluentdはデータ収集用のオープンソースソフトウェアです。ここでつらつらと文字を書いていくよりも画像を見せた方が早いと思うので下図をご覧下さい。上がfluentd導入前、下がfluentd導入後の画像です。

f:id:Juju_62q:20180528152334p:plain

f:id:Juju_62q:20180528152347p:plain

Fluentd | Open Source Data Collector | Unified Logging Layer

つまり、ありとあらゆるデータソースからありとあらゆるデータストアに投げることができます。この際にログに関しては柔軟に出力形式の変更やテーブルの変更を行うことができます。また、fluentdでは色々なデータベースのプラグインが書かれており、RDBはもちろんElasticsearchやAmazonのDynamoDB, GoogleのBigQuery等に関しては複雑な認証プログラム等を記述することなく出力を行うことが可能です。

ログ収集基盤として気になるのは信頼性ですが、Kubernetesの公式ログ機構として採用されるなど実績は十分でGoogleにも認められているアプリケーションです。

https://docs.fluentd.org/v0.12/articles/kubernetes-fluentd

fluentdの利用で得られるメリット

自分はfluentdを利用するメリットとして下記のようなものがあると思います。

  • 開発者が煩わしいログ送信実装から解放される。
  • データストアの追加、変更をしてもアプリケーションエンジニアに負荷がない。(インフラエンジニアがデータストアを選定できる。)
  • バッファリングができるためリクエストの数が抑えられる。
  • バッファをファイルに書き込むことで突然の障害時に送られないログを減らすことができる。
  • ログ収集部分をfluentdに任せることでアプリケーションの負荷を下げることが可能。

fluentdを利用することでアプリケーションのログ収集機構を抽象化することができます。総合的にはアプリケーションエンジニアの負荷を減らし、ログ収集についての部分をインフラエンジニアで巻き取るということが可能です。

実際にfluentdを使ってみる

実際に使っていただける例として下記のリポジトリを用意しました。 nginxのアクセスログをfluentdを経由してElasticsearchにデータを流しています。それを可視化するためにkibanaも加えています。

docker-compose up --build

を実行することでアプリケーションは起動します。

github.com

なお今回のブログではElasticsearchに関する説明等は割愛させていただきます。ご存知ない方や気になる方はこちらをまずご覧下さい。

www.elastic.co

nginxの設定

nginxの設定についてはログの出力の部分について手を加えています。 今回はaccess.logを実体がなくstdoutに出力される/var/log/nginx/access.logではなく/var/log/nginx/fluentd_access.logに出力しています。 また、データストアのElasticsearchを意識してLTSVの型に成形しています。

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format ltsv 'time:$time_iso8601\t'
                    'remote_addr:$remote_addr\t'
                    'request_method:$request_method\t'
                    'request_length:$request_length\t'
                    'request_uri:$request_uri\t'
                    'https:$https\t'
                    'uri:$uri\t'
                    'query_string:$query_string\t'
                    'status:$status\t'
                    'bytes_sent:$bytes_sent\t'
                    'body_bytes_sent:$body_bytes_sent\t'
                    'referer:$http_referer\t'
                    'useragent:$http_user_agent\t'
                    'forwardedfor:$http_x_forwarded_for\t'
                    'request_time:$request_time\t'
                    'upstream_response_time:$upstream_response_time\t'
                    'host:$host';

    access_log  /var/log/nginx/fluentd_access.log  ltsv;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

fluentdの設定

fluentdには入力や出力を設定するfluent.confというファイルが存在します。 今回に関しては下記のように設定されています。

入力はファイルから行います。docker-compose.ymlでnginxのアクセスログがfluentdの/fluentd/log/fluentd_access.logに現れるように記述されています。 ファイルの変更を逐次確認し、末尾に差分があればfluentdが動作します。

<source>
  @type tail
  format ltsv
  path /fluentd/log/fluentd_access.log
  tag nginx
  pos_file /fluentd/log/nginx.access.pos
</source>
<match nginx>
  @type elasticsearch
  host elasticsearch
  port 9200
  include_tag_key true
  logstash_format true
  index_name fluentd
  type_name nginx
  logstash_format true
  <buffer>
    @type memory
    flush_interval 5s
  </buffer>
</match>

出力はElasticsearchに行います。Elasticsearchに出力する際にはpluginを利用しています。これはfluentdの本質ではないため下記をご覧いただければ幸いです。 github.com

結果

結果は

http://localhost:5601

にアクセスすることで視覚化されて確認することが可能です! 以下の写真のようになりました! nginxのURLとしては

http://localhost
http://localhost/example.html

にアクセスができるようになっており、アクセスするたびに以下のようにログが増加する様子がみて取れます。 f:id:Juju_62q:20180528233635p:plain

fluentdはnginxのログ収集以外にも柔軟に利用することができるので興味の湧いた方は試していただければと思います。

終わりに

いかがだったでしょうか?fluentdを利用してログ収集のイライラを解消してくれたらとっても嬉しいです! それではみなさん、快適なハックライフを!