joppot

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

サーバ プログラミング

railsのfluent-logger gemを使ってユーザーのアクセスをfluentdサーバに収集する

投稿日:

Pocket

9hs8

概要

みなさんこんにちはcandleです。前回からfluentd関連の記事を続けていますが、今回辺りから実用的な使い方を書いていきたいと思います。

fluentdと言えば、ビックデータで扱うようなデータを集め出力するサーバですが、これとrailsのfluent-logger gemを組み合わせてアクセスログをとってみたいと思います。

アクセスログは、別段fluentdを使わなくてもrailsログにもapacheログにも存在するのですが、いづれのログもアクセス以外のログがごちゃまぜに保存されているので、解析するためには使いづらいログです。

fluentd-loggerをうまく使えばアクセスだけを抽出してログとして残せるので後で解析が楽になります。

ちなみに、アクセスログに特化したfluentdに投げるactなんとかgemもあるのですが、そちらはカスタマイズ性が悪いので使いません。もしも手っ取り早くアクセスログを取りたい場合はそっちを使ってもよいかもしれません。


前提

ローカルかLAN内かVMでfluentdが1台自由に動かせる

適当なrailsアプリケーションがある
適当なrailsアプリケーションとは既にコントローラーやビューができていて、ブラウザからアクセス可能なものです。なければ、scaffoldを作ってみてください。

私の書いた記事ではbootstrap gemを使用したものしかありませんが良ければ参考にしくてください。
ruby on rails4でtwitterbootstrap3のgemを使用してscaffoldを作成する

SPONSORED LINK


fluent-logger gemをインストールする

適当なrailsプロジェクトのGemfileを開きます。
私は例によって、bootstrap3というプロジェクトを使います。

Gemfileを開いたら、下の内容を書き込みます。

gem 'fluent-logger'

writefuentlogger

保存したら、下のコマンドでfluent-loggerをインストールします。

bundle install

お約束ですね。
これでfluent-loggerがインストールできました。


アクセスログを取る為のプログラムを書く

railsプロジェクトのapp/controllers/application_controller.rbを開きます。

openapp

開いたら、class ApplicationControllerの中に下の記述を書き込みます。

Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
before_action :fluentpost
def fluentpost
  Fluent::Logger.post("myapp.access",{"url"=>request.fullpath,"time"=>Time.current.to_s})  
end

writefluentsetting

railsの設定はこれだけです。

解説していきます。

自明の理かもしれませんが、ApplicationControllerは他の全てのコントローラーのスーパークラスですね。つまり自分で作ったコントローラーは全てこのApplicationControllerを継承しています。ApplicationControlleにfluentdにログを投げる設定をすれば、他の全てのコントローラーでfluentdにログを投げるプログラムが実行されるわけです。

今記述したソースコードは始めにfluentdサーバにアクセスする設定を書いています。

host=>ではlocalhostを指定しています。もしも別のサーバでfluentdが動いている場合はそのホスト名かIPアドレスを入れてあげましょう。port=>ではfluentdのデフォルトポート24224を設定します。

次に、before_actionでfluentpost関数を実行させます。こうすることで、全てのコントローラーはアクションが実行されるまえにこのfluentpost関数を実行します。この書き方は多少問題を抱えています。ビューが無いアクションもfluentpost関数が実行されてしまいます。でも致命的な問題ではないので嫌な人はfilterを使うなりして対処してください。

最後のfluentpost関数の記述はタグmyapp.accessを付けてurlと日にちをfluentdに投げています。このアクセスログは必要最低限のデータしか投げていません。もしも、カスタマイズしたい場合は、ここにユーザー情報とかを入れても良いと思います。カスタマイズする際に気をつけて欲しいのは値がnilになる変数を扱う場合、if文などでnilを送信しないようにしてください。nilをpostするとエラーが出てしまいます。


fluentdの設定ファイルを作る

次に、fluentdの設定をしていきます。fluentdは起動させる時、初期設定では/etc/fluet/fluent.confを参照してそこに書いてある設定で動作します。

今回は練習ということもあるので、railsプロジェクトのconfig/フォルダにfluentフォルダを作って、そこにfluent.confの設定ファイルを作りたいと思います。

railsプロジェクトの中で

cd config/
mkdir fluent
cd fluent

でフォルダを作り、下のコマンドでfluent.confを作ります。

fluentd --setup ./

makefluentconf

作成できましたね。

fluent.confを編集する

fluent.confをemacsとかvimで開いて、下の内容を一番下にでも書いておきます。

今回は単純にアクセスログをファイル出力する方法を行います。

<match myapp.access>
  type file
  path /var/log/fluent/myapp_access
  time_slice_format %Y%m%d
  time_slice_wait 10m
  time_format %Y%m%dT%H%M%S%z
  compress gzip
  utc
</match>

上の設定はmyapp.accessというタグが付いたデータが来たら、/var/log/fluent/というフォルダに(myapp_access+時間)ファイルにデータを書き込むという意味になります。

恐らく、/var/log/fluent/フォルダが無いと思うので先に作成しましょう。
今は練習ですので、フォルダの権限を777にしてしまいましょう。

sudo mkdir /var/log/fluent/
sudo chmod 777 /var/log/fluent/

これでログを保存するフォルダができました。

fluentdを起動させる

そしたら、railsプロジェクトのconfig/fluent/に移動します。

cd config/fluent/

fluent.confを確認して下のコマンド入力します。

fluentd -c ./fluent.conf -vv

startmyappfluent

止める時は「ctrl+c」で止められます。

fluentdが起動しました

アクセスログを収集してみる

これで準備が整いました。railsサーバを起動して、ブラウザからrailsにアクセスしてみましょう。

bundle exec rails s

viewwebservic

適当にアクセスをしましょう。

新しくコンソールを開いて、下のディレクトリに移動します。

cd /var/log/fluent/

loggeddata

すると、ファイルが作成されていますね。

中身を除くと、データが保存されています。

myappaccesslog

うまくいきました。

本番環境でのみ動作するようにする

おまけですが、今回紹介した書き方をすると本番環境以外でもデータを収集しようとします。
開発環境では別にfluentdにデータを投げる必要は無いと思います。
下のようにif文を書けば、本番環境でのみfluentdにデータを投げるので便利です。

Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224) if Rails.env.production?
before_action :fluentpost if Rails.env.production?
def fluentpost
  Fluent::Logger.post("myapp.access",{"url"=>request.fullpath,"time"=>Time.current.to_s})  
end


まとめ

今回は単純なアクセスログだけを扱いましたが、次回deviseを掛けあわせたユーザーの情報も合わせたアクセスログの収集の仕方をやってみたいと思います。

スポンサードリンク

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

-サーバ, プログラミング
-,

執筆者:


comment

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

関連記事

正規表現を極めるその1

概要 みなさんこんにちはcandleです。今回から正規表現を1から100まで極めようと思います。 正規表現って、使えると便利ですが、それを勉強して使いこなせている人って少ないと思います。この機会にぜひ …

basscss v8以降にv7以前のスタイルを追加する(自分用メモ)

概要 みなさんこんにちはcandleです。今回はbasscssのv8でかなりデフォルトのスタイルから削除されてしまったスタイルをインポートします。 v7以降からbasscssのスタイルはかなり分割され …

fabricのsshのネットワーク設定でパスワードか公開鍵を使って認証する

概要 皆さん今日はcandleです。今回はsshを使ったfabricの設定をしましょう。 一般にsshにはパスワード認証と公開鍵認証があるので、そのどちらも試してみましょう。 もちろんセキュリティ面で …

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

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

fabricでvagrantのデフォルトの秘密鍵を使ってサーバにアクセスする

概要 みなさんこんにちはcandleです。今回はfabricを使ってvagrant上のvmにアクセスする方法を紹介します。様々なサイトを閲覧すると、あまりvagrantのデフォルトの鍵を使用して、fa …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ