Rubyにはログを作成するための機能としてlogegrライブラリを利用できます。ログの解析はWebシステムの安定稼働に必須の機能です。Ruby on Railsを使用ってWebシステムを作成にならログ出力の機能をうまく利用しなければなりません。
今回は、Rubyでログファイルを作るための機能、loggerクラスの機能と使い方を紹介してください。
ログの重要性
Ruby on Railsで作られたWebシステムに限らず、システムの不具合の原因を調べたり改善方法を検討するなど、システムを運用するならログ解析が欠かせません。今回紹介するloggerライブラリは、Rubyの標準に組み込まれたログの生成をサポートする仕組みです。
loggerについて紹介する前にログの重要性について解説します。
そもそもログとは何か
ログとはシステムやソフトウェアの稼働状況やエラーや障害などの発生状況などを記録した情報です。通常日時と稼働状況や発生状況などを記述したテキストをファイルに書き出します。
ただし単純に日時と状況だけを書き出せば良い、というものではありません。目的に合わせて必要な情報を書き出し、分類しやすいようにラベル付けをしたり、エラーコードを添付するなど、後で分析しやすいように工夫されています。
そしてそのようなログを詳細に解析すれば、システムを誰が、何時、何に使ったかが分析でき、さらにどのような処理で不具合が発生するかなども調べられます。特に人が監視できないWebシステムでは、その運用上ログの解析が不可欠です。
ログを作る方法
先ほど説明したように今の情報システムに不可欠なログですが、魔法のようなツールがあって、それを動かせばどのシステムのログでも取れる、ということはありません。
情報システム毎にどのようなログを書き出すかを検討し、それを分類して、レベルに応じた内容のログを書き出す処理を組み込む必要があります。
さらにRubyのエラーメッセージやワーニングメッセージを取得し、それをログに書き出す仕組みも必要です。Rubyのエラー処理と連動した仕組みも検討してください。
Rubyでログを書き出すには
Rubyにはログの生成をサポートする仕組みが組み込まれており、これを利用することでエラーやワーニング発生時のログ出力にも対応したログ生成処理を記述できます。そしてその仕組みとは、Rubyに標準ライブラリとして提供されているloggerライブラリの機能です。
loggerライブラリは簡単に使えるので、ぜひ、ログに書き出す内容を検討し、それを書き出す処理をloggerライブラリを使って作成してください。
Rubyのloggerライブラリの基本
先ほど紹介したように今回紹介するloggerライブラリはRubyでログを記録する機能を提供する仕組みです。ログはRuby on Railsで作成するWebシステムに必須の機能です。
次からlogegrライブラリの使い方について解説します。
loggerライブラリにおける情報の分類
loggerライブラリでは、ログに出力する情報の重要度を定義しており、レベルが高い情報ほど重要な情報としています。なお、それぞれのレベルでログを出力するためのメソッドが定義されているので、それを使ってログに書き出してください。
また、本番サーバーならこのレベルまでログに出力する、デバック用サーバーならこのレベルまでログに出力する、といった使い方が可能です。その場合は、出力するレベル指定のメソッドを利用してください。
loggerライブラリに定義されたログ情報のレベル
UNKNOWN ログに出力される必要のある未知の情報 (対応するメソッド .unknown)
FATAL プログラムをクラッシュさせるような致命的なエラー (対応するメソッド .fatal)
ERROR エラー (対応するメソッド .error)
WARN ワーニング (対応するメソッド .warn)
INFO 一般的な情報 (対応するメソッド .info)
DEBUG デバック用の情報 (対応するメソッド .debug)
なお、出力したいレベルを指定する場合は、levelプロパティで指定します。
ワーニングより上のレベルのログ出力する場合の例
logger.level = Logger::WARN
loggerのオブジェクトを初期化する
Rubyでライブラリを利用するためには、プログラムの最初でそのライブラリを読み込み、インスタンスしてlogegrの機能を利用するためのオブジェクトを作ります。
なお、インスタンスする際、ログを出力するためのログファイルを指定します。WebシステムでRubyを利用する場合は、ファイルの書き込み権限に注意してください。
logegrライブラリを初期化する例
require 'logegr' logger = Logger.new('/var/www/tmp/ruby.log')
この例では、loggerライブラリを読み込み、ログファイル「/var/www/tmp/ruby.log」を指定して、ログ書き込み用のオブジェクトlogを生成しています。
ログに出力する処理の書き方
ログ書き込み用のオブジェクトを作ったら、ログとして書き出ししたい場所でレベル毎のメソッドを使い、ログ出力処理を作成します。
loggerオブジェクト.レベルに応じたメソッド( メッセージ )
ERRORレベルのログ出力の例
logger = Logger.new('./logfile.log') ... logger.error("エラーが発生しました")
上の例の処理でログファイルに出力されるログの例
E, [2021-03-11T10:36:31.543668 #11220] ERROR -- : エラーが発生しました
loggerのメソッドの使用例
さきほど説明したようにRubyのlogegrクラスを利用すれば、プログラムで不具合が発生したタイミングで、内部の情報をログファイルに書き出すことが可能です。では、どこにログを書き出す処理を書けがいいでしょうか。
具体的なログ書き出し処理の書き方が知りたい方に、loggerクラスに含まれるメソッドの使用例を紹介します。
Rubyの例外処理
多くのプログラム言語には、エラーで処理が止まるようなケースでも通常処理から別の処理に切り替えて処理を継続する例外処理に切り替えられます。具体的にはJavaやC++の例外処理で使うのがtyr~catchです。
そしてRubyではこのような例外処理をbegin~rescueに記述します。
Rubyの例外処理の書き方
begin
(例外が起きるかもしれない処理)
rescue => (例外オブジェクトを代入する変数)
(例外が発生した際に実行する処理)
ned
loggerライブラリによるログの書き出し処理を上記のrescueとendの間に記述することで、エラーの発生場所やエラー内容をログファイルに書き出せます。
例外処理のバックトレースを出力する
エラーが発生した際のメッセージをログファイルに書き出したとしても、長いプログラムのどこでエラーになったか解らないと原因の解析や不具合の修正ができません。そこでRubyの例外処理にはエラーが発生した場所を特定するためにバックトレース機能が用意されています。
バックトレースはメソッドがどこから呼び出されたかを調べる機能です。そして先ほど説明したrescue構文で指定する例外オブジェクトのbacktraceメソッドで調べられます。
backtraceメソッドの使い方の例
rescue => e p e.backtrace end
この例では「rescue => e」で指定した例外オブジェクト「e」を用い、そのバックトレースを表示します。
例外処理におけるloggerの使用例
これまで説明したようにRubyの例外処理を使えばプログラムでエラーが発生したとしても利用者にエラー発生を伝えるメッセージを表示し、loggerクラスを使ってバックトレース機能を使った詳細なログを残すことが可能です。
次に、rescueで受け取った例外オブジェクト「e」のメッセージとバックトレースをログファイルに書き出す、loggerライブラリの使用例を紹介します。
例外処理でloggerライブラリの使用例
begin (例外が起きるかもしれない処理) ... rescue => e logger.error.e.message logger.error e.backtrace end
この例では、「logger.error.e.message」の処理により例外処理で受け取ったエラーメッセージをログファイルに書き出し、続けて「logger.error e.backtrace」の処理によりバックトレースをログファイルに書き出しています。
まとめ
これまで紹介したようにRubyのloggerライブラリを利用することで、Rubyのプログラムの中で簡単にログファイルに書き出す処理を作れます。Ruby on Railsで作られたWebシステムを安定して稼働させるためにはログファイルの解析が欠かせません。
ぜひ、logegrクラスを活用してログを出力する仕組みを作り、Webシステムの運用管理に役立ててください。