joppot

コピペで絶対動く。説明を妥協しない

サーバ

fluentdのs3 pluginを使用して日付区切りでログデータをS3に送信する

投稿日:2014年8月20日 更新日:

Pocket

8oef

概要

みなさんこんにちはcandleです。今回はfluentdのs3プラグインを使用して、railsなどのログを日単位でS3に投げる方法を紹介します。もちろん、応用して年単位とか月単位、時間単位で区切りこともできます。

fluentdはプラグインを使用することで様々な機能が使えるよになります。その1つにS3にログデータをアップロードする機能があります。
これを使うと、fluentdサーバでログデータを一括して持っておかなくてもよくなるので、データの紛失のリスクや記憶容量の削減などができるので便利です。

前提

fluentdが1台自由に使える
fluentdサーバはvagrantでもLan内のハードでもVPSでもなんでも構いません。

S3へアクセスできるIAMを持っている
もしも、IDとシークレットキーを持っていればそれを使ってください。ない場合は私のブログの下のURLを参考にしてください。

https://joppot.s3.amazonaws.com/2014/06/14/1621

SPONSORED LINK


fluentd-plugin-s3をインストールする

始めに、fluentdを動かすサーバにssh接続します。私はvagrant上で動いているCentOS6.5を使用します。

ログインしたら下のコマンドでs3プラグインをインストールします。

fluent-gem install fluent-plugin-s3

もしもこのコマンドでうまくいかない場合は

gem install fluent-plugin-s3

で試してみてください。

s3fluentd

インストールが完了しました。


fluentdの設定ファイルを作る

もうすでに、fluentdで使っている設定ファイルがあるならここは飛ばしてください。
無い場合はfluentdのデフォルト参照先の/etc/fluent/にfluent.confを作ります。
下のコマンドで作成しましょう。

sudo mkdir /etc/fluent/
sudo chown root:`whoami` /etc/fluent/
sudo chmod 775 /etc/fluent/

cd /etc/fluent/
fluentd --setup ./

作成できたでしょうか?

createfluentconf

fluentd.confを編集してS3にデータを投げる

/etc/fluent/fluent.confをエディタで開きます。vimでもemacsでもどちらでも構いません。

一番下に下の記述を書きましょう。

<match uptest>
 type s3
  aws_key_id IAMで取得したS3にアクセスするid
  aws_sec_key IAMで取得したS3にアクセスするシークレットキー
  s3_bucket バッケット名
  s3_endpoint バケットが置かれている場所

  #s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
  path uptest/
  buffer_path /var/log/fluent/uptest
  time_slice_format %Y/%m/%d
  format json
  time_slice_wait 1s
</match>

私の場合は下の様な感じになります。

fluents3setting

バケット、エンドポイントは各々自分のS3にあるバッケットのものにしてください。

fluentdのS3の設定は以上です。

バッファーのフォルダを作る

buffer_pathで指定した/var/log/fluentフォルダを作る必要があります。もしも無い場合は作っておきましょう。

sudo mkdir /var/log/fluent/
sudo chown root:`whoami` /var/log/fluent/
sudo chmod 770 /var/log/fluent/

バッファーファイルとかは一時的にfluentdに来たデータを溜めておいて、時間が来たらS3にアップロードするためのファイルです。

S3に日付区切りでアップロードする試行錯誤

この設定にいき着いた、経緯と試行錯誤を紹介します。説明が不要な方は読み飛ばしてください。

S3へファイルをアップロードする場合、公式サイトにある設定は以下の様に書いてあります。

<match pattern>
  type s3

  aws_key_id YOUR_AWS_KEY_ID
  aws_sec_key YOUR_AWS_SECRET/KEY
  s3_bucket YOUR_S3_BUCKET_NAME
  s3_endpoint s3-ap-northeast-1.amazonaws.com
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
  path logs/
  buffer_path /var/log/fluent/s3

  time_slice_format %Y%m%d-%H
  time_slice_wait 10m
  utc
</match>

ここで重要になるのが、
time_slice_formatです。%Y%m%d-%Hというのは時間区切りでファイルを分割する事を表しています。
この設定では、s3_object_key_formatに従って下の様に、ログファイルが集積されまれます。
s3write

これだとlogsフォルダにファイルが蓄積しすぎてしまいます。

%Hつまり時間単位で分割をしているので、ファイルが分割されすぎています。もちろん、ものすごい情報が蓄積されるログ情報とかならそれでもよいのですが、日にち単位で分割した方が時間単位で分割するよりも管理が簡単そうです。

S3のフォルダ構造はスラッシュをつけるだけで簡単にフォルダとして分割できます。今回の設定ではpathを「uptest/」にしてtime_slice_formatは「%Y/%m/%d」にしています。
uptest, %Y, %mはフォルダになり、%dがファイル名の一部になります。
上で紹介した設定では下の様にログファイルが分割されます。

s3time

ということでした。

fluentdの動作確認をする

fluentdサーバを起動します。

fluentd -c /etc/fluent/fluent.conf -vv

別のウィンドウで、下のコマンドを実行します。

echo '{"first":"hello"}' | fluent-cat uptest

エラーがでなければ多分上手くいっています。バッファーファイルが/var/log/fluent/に出来ていると思うので確認します。

cd /var/log/fluent/
ls

下の様な感じにできます。
upsetfile

うまくいっていますね。このバッファーファイルは夜中の12時をまわるとs3に投げられ、次の日のファイルがまた新しくバッファーファイルとして作成されます。

S3にアップロードされると下の様な感じになります。
s3logs

19_0と19_1ができているのはtime_slice_waitが1sつまり1秒ほどバッファーを次の日になっても取り続けているからです。できれば、ひとまとめにしたいので、もしかすると
time_slice_waitを0sとかにすればできるのかもしれませんが、まだ試していません。

まとめ

この設定にはだいぶ苦労しました。まだfluentdの文献が少ないので、ちょっとしたことでも案外思いつかなかったりしました。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

railsのfluent-loggerとdevise gemを使ってユーザーの行動をfluentdサーバに収集する

概要 fluentdと言えば、ビックデータで扱うようなデータを集め出力するサーバですが、これとrailsのfluent-logger gemとdevise gemを組み合わせてユーザーの行動ログをとっ …

ubuntuでnginxの起動と最低限のコマンド

概要 今回は、nginxの起動と最低限のコマンドをまとめました。 前提 nginxがインストールされている nginxの起動と停止と再起動 nginxはインストールした当初の設定ではubuntuを起動 …

MAMPでphpのshell_execを使用してunixコマンドを実行できない場合の対処(imagemagick,convert)

概要 みなさんこんにちはcandleです。今回はちょっと問題が起きてshell_execがうまくいかないときのトラブルシューティングをまとめます。 私はMAMPをバージョンアップする前は、phpのsh …

ruby on railsのckeditor gemをapacheのproductionの本番環境で動かす

概要 みなさんこんにちはcandleです。今回はckeditorを本番環境で動かしてみたいと思います。 とは言っても基本的な記述はdevelopment環境と同じなので、そこまでは前回の記事を参照お願 …

pythonのfabricでファイルを分割しfabfileに読み込む方法

概要 皆さんこんにちはcandleです。今回はfabricで分割したpythonファイルを読み込んでみましょう。 fabricはfabfile.pyというファイルに実行したいコマンドを書くのですが、 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ