Rails loggerとは?使い方とDebuggingへの活用まで
Rails開発者であれば、少なくとも1度は Rails Logger を利用したことがあることでしょう。もしくは意識はしていなくても、例えば、 rails server を実行し、その際にターミナルに情報が表示されるという形で Rails Logger を利用していたりします。
Rails Logger はアプリケーションの強力なデバッグ方法と、エラー発生時に原因を理解するための洞察を提供してくれます。
ただ、果たしてあなたは Rails Logger の全ての機能を利用しているのでしょうか。おそらくはそうではないと思われます。
それでは、Rails のロギングシステムのより深く見ていきましょう。利用したことのない機能を知ることで、将来のログ生成のベストプラクティスを確立しましょう。
What is the Rails Logger?
Ralis Loggerとは、ActiveSupportの内の一つの機能です。ActiveSupportはutilityであり、Rubyの標準ライブラリに含まれるクラスを拡張したコア拡張機能の集まりです。Rails LoggerはRubyのLoggerクラスの上に構築され、アプリケーションが稼働している間に発生するイベントを記録するシンプルな仕組みを提供します。
ロギングは後に分析やデバッグを行えるよう、アプリケーションが実行されている間の情報を永続的に記録し保存します。
Railsは development,test,production の3つのデフォルトの環境毎に別々にログを生成するように構成されています。デフォルトの設定では、これらのログファイルはあなたのprojectの log/ ディレクトリに出力されます。
log/ ディレクトリを開くと、development logファイルとtest logファイル、そしておそらくは production.logが出力されています。(projectの設定に依存します)
Rails Logger を利用するには Controller、Model、Mailer に下記のようにシンプルに1行書き加えるだけです。
logger.debug “User created: #{@user.inspect}”
ここではグローバルにアクセスできる logger の debug メソッドを使用し object の詳細をログに書き出しています。 development 環境ではターミナルと development.log ファイル双方にログメッセージを出力しています。
上記で指定したデバッグレベルは6つあるうちの一つに過ぎず、それぞれのデバッグレベルに対応したメソッドが存在します。
ログ出力にレベルの仕組みを持つことで、ログのグルーピングが可能となり、どのログレベルは出力し、どのログレベルはしないのか選択ができるようになります。
例えば、本番環境であれば、低いレベルにはさほど注意を払う必要がないかわりに、エラーや警告発生時には検知したいといった具合です。それぞれのログレベルと用途について見ていきましょう。
Customizing our logs
おそらく殆どのRails Logger を利用している Rails 開発者は必要に応じデバッグメッセージをログ出力しているだけだと思われます。しかし、この強力なツールによってできることはもっともっと沢山あります。デフォルトの設定とは異なる動作をするようにロギングシステムをカスタマイズする方法を見てみましょう。
ロガーの設定は、メインの設定である application.rb ファイルをカスタマイズすることもできますし、環境ごとに、config/development.rb、config/test.rb 、または config/production.rb ファイルをカスタマイズすることもできます。
ここでは、レポートされるログのレベルを変更したり、ログの出力先を変更したり、独自のフォーマットでのログ出力を行う設定ができます。
Changing the log level
ログメッセージにより本番環境のログファイルが肥大化しすぎないようにするために、ログレベルを :error に設定することができます。これによりエラーレベル以上のログメッセージのみがレポートされるようになります。つまり、Error と Fatal のログのみがレポートされるようになります。
# config/environments/production.rb
config.log_level = :error
これらの環境初期化ファイルの外から一時的に直接コード内の任意の箇所でログレベルを下記のように、変更することができます。
# From anywhere, you can specify a value from 0 to 5
Rails.logger.level = 3
これは、ある特定のタスクに関するログのみ詳細にレポートし、すぐに再度オフにするような場合に有効です。
Changing the log location
ログファイルの保存先を log/ 以外の場所に指定したい場合、下記のように新しいロガーを定義し任意のパスを指定することができます。
# config/environments/development.rb
config.logger = Logger.new(“/path/to/file.log”)
Changing the log format
さらに柔軟性を高めるには、 Rail’s の formatter クラスを自身で作成した独自のカスタムクラスでオーバーライドします。これによりログの見た目を完全に定義することができます。さらに必要に応じて、独自の複雑なロジックを追加して何を、どのようにログに記録するのかを定義することもできます。
class CustomFormatter < ActiveSupport::Logger::SimpleFormatter
def call(severity, time, progname, msg)
"[Level] #{severity} \n" +
"[Time] #{time} \n" +
"[Message] #{msg} \n\n\n"
end
end
lib/ folder に上記ファイルを保存すると下記の様に Rails Logger を利用することができます。
# config/environments/development.rb
config.log_formatter = CustomFormatter.new
このように、たったこれだけの小さな簡単な変更でも、ログが遥かに読みやすくなりました。
独自フォーマットのクラスを作成した優れた利用例として、ログをJSON形式で出力し他のシステムと連携するという方法もあります。
Tagged Logging
Rails Logger のもう一つの強力な機能に、ログエントリーにタグを付けがあります。
アプリケーションが複数のサブドメインで実行されているようなケースでは非常に便利です。このシナリオでは、サブドメインタグを追加することで、利用している様々なサブドメインのログエントリーを明確に分離できます。
もう一つの例としては、 request ID タグを追加する使い方があります。これはデバッグ時に、特定のリクエストのログのみを全体のログから分離し確認できるという意味で非常に便利です。
ログへのタグ付けを有効にするには、新しい TaggedLogging を作成し、構成ファイルの config.logger に割り当てる必要があります。
# config/environments/development.rb
config.logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
この設定が完了したら、下記のようにコードの中で、 tagged メソッドを利用し、ログに出力することができます。
# This will log: [my-subdomain] User created: ...
logger.tagged(“my-subdomain”) { logger.debug “User created: #{@user.inspect} }”
What’s next?
Rails Loggerは、Debuggingする上ではとても使いやすいですが、パフォーマンスチューニングまで行うことは難しいかもしれません。ここまで読んでくれた方なら、APMなどのモニタリングツールについても興味があるのではないでしょうか?
もしご興味ありましたら、こちらからプロダクトデモの予約、またはsupport@scoutapm.comまでご連絡ください。
ここまで、閲読頂きありがとうございます!犬のイラストをクリックしていただきますと、無料でScout関連商品をお届けします!