fluentdを利用してログ収集を簡単にしよう!
おはこんばんちは!@ジュジュです!
今回のブログではRubyで書かれたログ収集の万能マンfluentdについて書こうかと思います。プラグインも含め開発者がほとんど日本人のソフトウェアです。なんだか誇らしいですね。
対象読者
- ログ収集って面倒くさいよねって思っている人。
- fluentdって聞いたことあるけどまだ使ったことがない人。
- ログの収集をハンドリングしたいインフラエンジニア。
記事の内容
- fluentdって何?っていう疑問に答えて行きます。
- fluentdを実際に利用する例を挙げて行きます。
- fluentdを利用することでどんなメリットが享受できるのかまとめて行きます。
今回のブログはこのLTに具体的な設定を加えたものでもありますので、ぜひ事前にご覧下さい!
fluentdとは
fluentdはデータ収集用のオープンソースソフトウェアです。ここでつらつらと文字を書いていくよりも画像を見せた方が早いと思うので下図をご覧下さい。上がfluentd導入前、下がfluentd導入後の画像です。
Fluentd | Open Source Data Collector | Unified Logging Layer
つまり、ありとあらゆるデータソースからありとあらゆるデータストアに投げることができます。この際にログに関しては柔軟に出力形式の変更やテーブルの変更を行うことができます。また、fluentdでは色々なデータベースのプラグインが書かれており、RDBはもちろんElasticsearchやAmazonのDynamoDB, GoogleのBigQuery等に関しては複雑な認証プログラム等を記述することなく出力を行うことが可能です。
ログ収集基盤として気になるのは信頼性ですが、Kubernetesの公式ログ機構として採用されるなど実績は十分でGoogleにも認められているアプリケーションです。
Kubernetes Logging with Fluentd | Fluentd
fluentdの利用で得られるメリット
自分はfluentdを利用するメリットとして下記のようなものがあると思います。
- 開発者が煩わしいログ送信実装から解放される。
- データストアの追加、変更をしてもアプリケーションエンジニアに負荷がない。(インフラエンジニアがデータストアを選定できる。)
- バッファリングができるためリクエストの数が抑えられる。
- バッファをファイルに書き込むことで突然の障害時に送られないログを減らすことができる。
- ログ収集部分をfluentdに任せることでアプリケーションの負荷を下げることが可能。
fluentdを利用することでアプリケーションのログ収集機構を抽象化することができます。総合的にはアプリケーションエンジニアの負荷を減らし、ログ収集についての部分をインフラエンジニアで巻き取るということが可能です。
実際にfluentdを使ってみる
実際に使っていただける例として下記のリポジトリを用意しました。 nginxのアクセスログをfluentdを経由してElasticsearchにデータを流しています。それを可視化するためにkibanaも加えています。
docker-compose up --build
を実行することでアプリケーションは起動します。
なお今回のブログではElasticsearchに関する説明等は割愛させていただきます。ご存知ない方や気になる方はこちらをまずご覧下さい。
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
にアクセスができるようになっており、アクセスするたびに以下のようにログが増加する様子がみて取れます。
fluentdはnginxのログ収集以外にも柔軟に利用することができるので興味の湧いた方は試していただければと思います。
終わりに
いかがだったでしょうか?fluentdを利用してログ収集のイライラを解消してくれたらとっても嬉しいです! それではみなさん、快適なハックライフを!