【Rails入門】loggerの使い方まとめ

こんにちは! フリーエンジニアの長瀬です。

今回はlogger(ロガー)の使い方について一緒に学んでいきましょう。

loggerを使えば、Railsで簡単にログを出力できます。

この記事では、loggerの使い方について

・loggerの設定方法

という基本的な内容から、

・ログの色付けを行う方法

といった応用的な内容についても解説していきます。

目次

loggerとは

loggerはログを出力するために、Railsにあらかじめ用意されている機能です。

また、loggerの機能はActiveSupportクラスを継承したLoggerクラスによって構成されています。

loggerを使えば、簡単にログを出力できます。

なので、バグの原因を探すときなどに便利です。

loggerの設定方法

loggerは

・config/application.rb
・config/evironments/development.rb
・config/evironments/production.rb
・config/evironments/test.rb

のいずれかの初期設定ファイルであればconfig.〇〇〜で始まるコードで設定できます。

記事の後半で説明しますが、どのファイルにloggerを設定するかで環境別にログの出力ができます。

以下はlogger設定のサンプルコードです。

config.logger = Logger.new(STDOUT)

もしくは

config.logger = Logger.new('log/development.log')

でロガーを設定できます。

Logger.new関数では第1引数にログを保存する場所を指定できます。

STDOUTは標準出力にログを出力する場合の引数です。

また、標準設定でのログの出力先はlog/development.logになっています。

上記のように設定できれば、Model、Controller、Viewでログを出力できます。

では実際に出力してみましょう。

以下、出力のサンプルコードです。

<% logger.debug "log/development.logにログが出力されています。" %>

また、log/development.log以外のファイルに保存したい場合は独自にLogger.newの引数にファイルの場所を指定できます。

標準以外のファイルを指定するサンプルコード

config.other_logger = Logger.new('log/development_other.log') 

独自にファイルを指定し、保存した場合は出力する際のコードも変わります。

以下、出力のサンプルコードです。

<% Rails.application.config.ohter_logger.debug "log/development_other.logにログが出力されています。" %>

これでlog/development_other.logに保存するログを保存することができました。

このように、log/development.log以外のファイルにも簡単にログを保存できます。

ログレベルを設定する方法

loggerでは、ログにレベルを設定できます。

ログレベルは以下6つあり、そのログの内容によって使い分けます。

unknown(常にログとして出力される必要がある未知のメッセージ)
fatal(プログラムをクラッシュさせる制御不可能なエラー)
error(制御可能なエラー)
warn(警告)
info(システム管理についての一般的、または役に立つ情報)
debug(開発者のための低いレベルの情報)

ログレベルは

unknown>fatal>error>warn>info>debug

の順に出力が優先されます。

ログレベルを設定するには

・config/application.rb
・config/evironments/development.rb
・config/evironments/production.rb
・config/evironments/test.rb

のいずれかのファイルであれば以下のサンプルコードで設定できます。

config.log_level = :unknown
config.log_level = :fatal
config.log_level = :error
config.log_level = :warn
config.log_level = :info
config.log_level = :debug 

例えば

config.log_level = :fatal

の場合、fatal以下のerror、warn、info、debugのレベルのログは出力されなくなります。

そして、

config.log_level = :unknown

の場合はログレベルがunknown以外は出力されなくなります。

(unknownのログレベルが一番高いからです)

また、
上記のファイル以外でログレベルを設定したい場合は以下のコードでできます。

Rails.logger.level = 5

Rails.logger.levelは0〜5までの数値でログレベルを設定します。

番号に対応して

0(debug)
1(info)
2(warn)
3(error)
4(fatal)
5(unknown)

となっています。

では次は、出力の際にログレベルを設定してみましょう。

logger.〇〇の値をログレベルに応じて変更するだけです。

以下は実際のレベル別でのログ出力のサンプルコードです。

<% logger.debug "log/development.logにdebugレベルでログが出力されています。" %>
<% logger.info "log/development.logにinfoレベルでログが出力されています。" %>
<% logger.warn "log/development.logにwarnレベルでログが出力されています。" %>
<% logger.error "log/development.logにerrorレベルでログが出力されています。" %>
<% logger.fatal "log/development.logにfatalレベルでログが出力されています。" %>
<% logger.unknown "log/development.logにunknownレベルでログが出力されています。" %>

このように、ログレベルよってログの出力を制限して管理できます。

ログレベルを設定しておくと、レベルに応じてログの出力を減らすことができて効率的です。

環境ごとにログを設定する方法

環境ごとにログを設定するには、ログを設定するファイルを使い分けます。

環境名設定ファイル名
本番環境config/evironments/production.rb
開発環境config/evironments/development.rb
テスト環境config/evironments/test.rb

ログの出力フォーマットを設定する方法

<% logger.unknown "log/development.logにレベルunkwnownでログが出力されました" %>

たとえば、上記のコードでログを出力するとき、フォーマットの設定がされていないなら

実行結果

log/development.logにレベルunkwnownでログが出力されました

と出力されます。

ここで、標準の出力フォーマットを設定してみます。

以下は標準の出力フォーマットを設定するコードです。

config.logger.formatter = ::Logger::Formatter.new

と設定すると、ログの出力が変わり

実行結果

A, [2017-06-26T10:27:53.706386 #6909]   ANY -- : log/development.logにレベルunkwnownでログが出力されました

と出力されるように変わります。

先頭のAはANY(unknownレベル)のAです。

またフォーマットは独自に変更できて、

config.logger.formatter = proc do |severity, datetime, progname, msg|
  "プログラム名は#{progname} ログレベルは#{severity} ログの内容は#{msg} 日付は#{datetime} \n"
end

と設定すると

実行結果

プログラム名は ログレベルはANY ログの内容はlog/development.logにレベルunkwnownでログが出力されました 日付は2017-06-26 10:52:32 +0900

と出力されます。

プログラム名はとくに設定されていないと空(=nil)のままです。

ですので、ログ設定時に

cofig.logger.progname = 'チュートリアル'

とprognameを設定してみると

実行結果

プログラム名はチュートリアル ログレベルはANY ログの内容はlog/development.logにレベルunkwnownでログが出力されました 日付は2017-06-26 10:56:33 +0900

と出力されるように変わります。

このように標準の出力が見にくいと感じている方は独自のフォーマットを設定してみてはいかがでしょうか。

ログの色付けを行う方法

ログに色をつけるにはcolorize(カラライズ)というgemを使うと便利です。

まず、Gemfileに

gem 'colorize'

と記述し、コマンドプロンプトで

bundle install

と打ち込んでcolorizeをインストールします。

 
インストール後は文字列の後に.colorize(:色の名前)で、簡単にログに色をつけることができます。

以下、色をつけるサンプルコードです。



<% logger.unknown "(赤色)log/development.logにレベルunkwnownでログが出力されました".colorize(:red) %>
<% logger.unknown "(黄色)log/development.logにレベルunkwnownでログが出力されました".colorize(:yellow) %>
<% logger.unknown "(青色)log/development.logにレベルunkwnownでログが出力されました".colorize(:blue) %>

実行結果
Screen Shot 2560-06-28 at 23.38.02

このようにログに色をつけることができました。

colorizeで使用可能な色は下記の仕様書から参照しています。

参照元: Github colorize

ですので、色の種類はこちらを参考にしてください。

また、背景色を設定もできます。

 <% logger.unknown "(黒に背景が赤)log/development.logにレベルunkwnownでログが出力されました".colorize(:black).on_red %>

実行結果
Screen Shot 2560-06-28 at 23.23.27

このようにcolorize(:色の名前).on_色の名前で背景色を設定できました。

まとめ

いかがでしたでしょうか?

この記事では、loggerの使い方を解説しました。

環境別にログを設定したり、ログレベルを設定したりすれば、ログの管理はしっかりできます。

また、重要なログには色をつけて他と区別するのもいいですね。

この機会にぜひ管理しやすいようにログを設定し直してみてはいかがでしょうか。

もし、loggerの使い方について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

目次