Fluentdで、RailsのログをS3に保存する方法

More than 3 years have passed since last update.


What is fluentd?


  • ログ収集をプログラマブルに実施し、状況に応じた柔軟な対応が実現できるソフトウェア

  • ログの管理を「インプット」「バッファ」「アウトプット」という3つの層に分けて管理

  • fluentdは内部で各ログデータに対して「タグ」を付与し、管理

  • fluentdではログの内容(レコード)がJSON形式になっている


    • そのため、アプリケーション側でのパースが容易であるというメリットがある




Why Fluentd? : ログ管理への要求


  • ログの多様化・肥大化への対応

  • ログ情報を基にした分析の必要性


fluentdの設定方法


インストール方法

様々なインストール方法がある


  • RPMパッケージからFluentdをインストールする (Redhat Linux)

  • DEBパッケージからFluentdをインストールする (Debian / Ubuntu Linux)

  • DMGパッケージからFluentdをインストールする (Mac OS X)

  • Ruby GemからFluentdをインストールする

  • ChefでFluentdをインストールする

  • ソースコードからFluentdをインストールする

インストール | Fluentd


Gemからインストールする場合


  • gemの場合は、/etc/init.d/ にスクリプトは作られません

  • daemontools, runit, supervisord, またはupstartのようなプロセス管理ツールを使う必要があります

$ gem install fluentd

$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test


RPMパッケージからFluentdをインストールする場合


  • td-agentは、fluentdを稼働させるために必要なRubyインタープリターを含んだ安定版パッケージ


Install td-agent

Installing Fluentd Using rpm Package | Fluentd

Overview of Streaming Import by Treasure Agent (td-agent) | Treasure Data


Pluginのインストール

$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-parser

$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3


Configure

sudo vi /etc/td-agent/td-agent.conf


インプットプラグインに関する設定

<source>

type forward
port 24224
</source>


アウトプットプラグインに関する設定


  • s3にログをアウトプットする設定を記述


  • buffer_pathで、一時的にログをバッファしておく場所を指定


  • flush_intervalを設定することで、バッファされていたログをS3に吐き出す間隔を設定可能



    • time_slice_waitで設定しても良いのかもしれません



<match foo>

type parser
key_name messages
format json
tag rails
</match>
<match rails>
type s3

aws_key_id AWS_KEY_ID
aws_sec_key AWS_SEC_ID
s3_bucket foo-log
s3_endpoint s3.amazonaws.com
s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}.%{file_extension}
path logs/
buffer_path /var/log/td-agent/buffer/s3

flush_interval 60s
time_slice_format %Y%m%d/%Y%m%d-%H
</match>

fluent/fluent-plugin-s3

30分でできる!オブジェクトストレージへのログ保存(fluentd編) | IDC Frontier Engineers' Blog

S3とFluentdを用いた効率的なログ管理 | SmartNews開発者ブログ


Fluentdの起動・停止方法

$ /etc/init.d/td-agent start

$ /etc/init.d/td-agent stop
$ /etc/init.d/td-agent restart
$ /etc/init.d/td-agent status


with Rails



  • Gemfileに以下のGemを追加

gem 'act-fluent-logger-rails'

gem 'lograge'



  • application.rbに以下を追加

    config.log_level = :info

config.logger = ActFluentLoggerRails::Logger.new
config.lograge.enabled = true
config.lograge.formatter = Lograge::Formatters::Json.new



  • config/fluent-logger.ymlを編集

development:

fluent_host: '127.0.0.1'
fluent_port: 24224
tag: 'foo'
messages_type: 'string'

test:
fluent_host: '127.0.0.1'
fluent_port: 24224
tag: 'foo'
messages_type: 'string'

production:
fluent_host: 'xxx.yyy.zzz.xxx'
fluent_port: 24224
tag: 'foo'
messages_type: 'string'


  • 環境変数にFLUENTD_URLを設定することでも対応可能


    • 今回は、複数台のサーバーで運用するため、こちらを採用し、サーバー毎にhost変数を設定した



export FLUENTD_URL='http://xxx.yyy.zzz.xxx:24224/foo?messages_type=string'

Collecting and Analyzing Ruby on Rails Logs | Fluentd

fluentd+rails+mongoでサクッとログ環境を整備してみる - dev.log

Streaming Import from Rails Apps | Treasure Data


Refs.

fluent/fluentd

actindi/act-fluent-logger-rails

fluent/fluent-logger-ruby

今さら聞けないfluentd~クラウド時代のログ管理入門(1):増えるログ、多様化するログをどう効率的に運用するか (1/2) - @IT

今さら聞けないfluentd~クラウド時代のログ管理入門(2):fluentdと定番プラグインのインストール (1/2) - @IT

今さら聞けないfluentd~クラウド時代のログ管理入門(3):fluentdの効果的な活用例と安定運用のポイント (1/3) - @IT

柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ

柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ - Part 2

柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ - Part 3

導入手順 - Fluentdにおけるログ運用 - Qiita

fluentdの簡単な使い方、設定方法一覧 - Hive Color