joppot

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

サーバ

td-agentでRails 4のproduction.logを取得する

投稿日:2017年3月17日 更新日:

Pocket


概要

みなさんこんにちはcandleです。今回はrails 4のproduction ログをtd-agentで取得してみたいと思います。
数年前にも同じ記事を書いたのですが、説明不足があったりしたので書き直します。
また、後日Rails5での取得の仕方も紹介します。

関連記事

rails5の方は以下の記事を参考にしてください。

td-agentでRails 5のproduction.logを取得する

前提

ruby on railsをproductionモードで動かせる

webrickでもnginxでもpumaでもapacheでも良いですが、productionモードで動かせる状態を作っておいてください。

td-agentかfluentdがインストールされている

ruby on railsを動かすマシーンにtd-agentかfluentdがインストールされている事が前提になります。

SPONSORED LINK


railsのログフォーマットを変更してみる

railsのproductionログのフォーマットはデフォルトで下のような感じになっています。

このログのフォーマットは簡単に変更できます。
下のコードはデフォルトのフォーマットから何も変更して無い状態のコードです。

class Logger::Formatter
  def call(severity, time, progname, msg)
    format = "%s, [%s #%d] %5s -- %s: %s\n"
    format % [severity[0], "#{time.strftime('%Y-%m-%dT%H:%M:%S')}.#{'%06d' % time.usec.to_s}", $$, severity, progname, msg2str(msg)]
  end
end

railsのプロダクションログには必要ではない情報が挿入されます。
それはどのパーシャルがレンダーされたかです。
下のはそのサンプルです。

I, [2017-03-24T06:19:15.314646 #5689] INFO — : Rendered users/shared/_links.html.haml (0.5ms)
I, [2017-03-24T06:19:15.315840 #5689] INFO — : Rendered users/registrations/new.html.haml within layouts/application (6.6ms)
I, [2017-03-24T06:19:15.318778 #5689] INFO — : Rendered layouts/_header.html.haml (0.6ms)
I, [2017-03-24T06:19:15.320581 #5689] INFO — : Rendered layouts/_footer.html.haml (0.8ms)

私はproductionモードではこの情報はいらないと思うし、ログのファイル容量を圧迫するので、表示し無い様にします。
もちろん、何も変更しなくても問題ありません。

config/environment.rbを開きます。

先ほどのフォーマットを以下の様に変更します。
erbを使っている人は”.haml”の部分を”.erb”に変更してください。

class Logger::Formatter
  def call(severity, time, progname, msg)
    if !msg.include?('.haml')
      format = "%s, [%s #%d] %5s -- %s: %s\n"
      format % [severity[0], "#{time.strftime('%Y-%m-%dT%H:%M:%S')}.#{'%06d' % time.usec.to_s}", $$, severity, progname, msg2str(msg)]
    end
  end
end


railsの設定は以上です。


td-agentでrailsログを取得する準備

それでは、td-agent側に移動します。

私はCentOS6.5の中でtd-agentを動かしています。
railsはunicorn + nginxで動かしたいと思います。
それらのサーバー構築はあらかじめお願いします。

td-agentの設定

railsのproductionログの最大の問題はFatalエラーが複数行に渡って表示されることです。
fluentdは基本的に1行が1つのデータにあたるので、複数行のエラーはそれぞれ別のログとして取得します。

これがrailsのfatalエラーです。

F, [2017-03-24T08:24:51.329266 #6165] FATAL — :
NoMethodError (undefined method `each’ for nil:NilClass):
app/controllers/pages_controller.rb:7:in `about’

そこで、format multilineを使います。
これはformat_firstlineで書かれた正規表現にマッチしない部分は改行されてもマッチした部分と同じものと認識し、1つのログに収納されます。

/etc/td-agent/td-agent.confを開き以下を記述します。

<source>
  @type tail
  path /usr/share/nginx/alice4/log/production.log
  tag rails.production
  pos_file /var/log/td-agent/rails.production.pos
  format multiline
  format_firstline /^.,/
  format1 /^(?<log_initial>.*), \[(?<date>\d{1,4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}.\d{1,6}) (?<process_id>[^ ]*)\] *(?<log_level>[^ ]*) -- : (?<message>[^\']*[^\]]*)/
</source>

<match rails.production>
  @type stdout
</match>

pathでrailsプロジェクトのlogフォルダにあるproduction.logを参照します。
参照先のパスは各自のものにしてください。

tag rails.production
で取得したログにタグをつけます。

pos_file /var/log/td-agent/rails.production.pos
一時ファイルの置き場を指定します。

formatではmultilineを宣言します。複数行のログの取得が可能になります。

format_firstline /^.,/ の正規表現は行の最初は「1文字+,」であるという宣言。
これはrails productionログの「I,」の部分に該当します。

format1ですが、これはrailsのproduction.logのフォーマットに合わせています。

<match rails.production>
で上のログを受け取り、標準出力します。

以上がfluentdがrails logを取得する為の設定です。

ログの取得を確認する

td-agentを再起動します。

sudo serice td-agent restart

本番環境のrailsアプリケーションを起動します。

アクセしてみましょう。

td-agentの確認は

/var/log/td-agent/td-agent.logに出力されます。

sudo tail -f /var/log/td-agent/td-agent.log

以下がそのログになります。

一番興味深いのはFATALのところ

2017-03-24 08:30:11.203171123 +0000 rails.production: {“log_initial”:”F”,”date”:”2017-03-24T08:24:51.329266″,”process_id”:”#6165″,”log_level”:”FATAL”,”message”:”\nNoMethodError (undefined method `each’ for nil:NilClass):\n app/controllers/pages_controller.rb:7:in `about’\n\n”}

ですね、一文にまとまってわかりやすくなっていると思います。

まとめ

Rails 4のproduction.loの取得をやってみました。

スポンサードリンク

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

-サーバ
-, ,

執筆者:


comment

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

関連記事

EC2にRDSの為のmysqlコマンドのみをインストールする

概要 みなさんこんにちはcandleです。今回はちょっとしたことですが、忘れない様にまとめておきます。 EC2でRDSを使う場合 EC2の中にMysqlサーバーは必要ありません。 ただmysqlコマン …

CentOS6.5にcomposerをインストールする

概要 みなさんこんにちはcandleです。cakephpではphpのライブラリ管理ツールcomposerと連帯して、便利に必要なライブラリを導入できます。 例えば、cakephpの標準テストツールph …

apacheのmod_rewriteでphpのGETパラメータのurlを書き換える

概要 みなさんこんにちはcandleです。今回はphpでgetでパラメータを受け取る際のurlの書き換えです。 例えば、phpよくあるのがこのようなurlではないでしょうか。 http://local …

vagrantで取得したlet’s encryptのssl証明書をec2のnginxで使用する

概要 みなさんこんにちはcandleです。今回は取得したvagrantのubuntuで取得したlet’s encryptを実際に使用してみます。 もしも、まだ取得してない人は前回の記事を確 …

macにmemcachedをインストールする方法と動作確認

概要 memcachedはrailsやphpのセッションを保持しておく時に使うソフトというかサーバ的なものです。一般にSNSやログイン式のサービスを提供する時はセッションというのを持ちます。セッション …

プロフィール


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

twitter

スポンサードリンク

アーカイブ