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

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

こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。

今日は、Rubylog、loggerについて解説します。

この記事では、

  • log、loggerについて
  • log出力レベルとは
  • 基本的なlogの出力方法
  • ログの出力先指定
  • ログレベルの指定方法
  • スタックトレースに改行をつけてログ出力
  • ログのファイルサイズ指定
  • ログのローテーション

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

  • datetime_formatによる日付フォーマット
  • logのフォーマットの指定方法
  • loggerシングルトンの例

などの応用的な使い方に関しても学習していきます。

このページで、Rubylog、loggerの使い方をよく把握して自分のスキルとしていきましょう!

log、loggerについて

logとは

logとはRubyの実行中に、途中経過や処理結果などテキストファイルに書き込んだものです。

logは主にバグやエラーの解決、デバッグなどに使用され、webアプリの開発などではとりあえずlogを見れば、問題の大方の推測はつくほどの優れものです。

logは例えば、以下のような表示(出力)をします。

以上のように、

  • ログを出力した日付
  • ログを出力したRubyのプロセス番号(ここでは#8136や#26884)
  • ログのレベル(ここではWARN:警告)
  • ログメッセージ(ここでは「ログ3」)

などが出力されています。

なお、プロセス番号とは、OSの元で動いているプログラム一つひとつに付番されたIDです。

ログはカスタマイズすることができて、エラーの発生したファイル名行番号を付与することもできます。

そのため、エラー解決、デバッグなどの指針に役立ちます。

logレベルとは

logにはlogレベルと呼ばれるものがあります。

logレベルによってlogの重要度が変わってき、logレベルによって出力するログを分けたりできます。

logレベルは以下の6種類に分けることができます。

logレベル意味
UNKNOWN常にログとして出力される必要がある未知のメッセージ
FATALプログラムをクラッシュさせるような制御不可能なエラー
ERRORエラー
WARN警告
INFO一般的な情報
DEBUG低レベルの情報

上に行くほどログレベルが高いと呼ばれ、より重要な情報を表しているログを表しています。

loggerとは

loggerとは、Rubyからlogを出力するユーティリティです。

log出力に関する様々な便利な機能を搭載しています。

loggerを使用するには、Rubyのファイル冒頭で、以下のように宣言する必要があります。

まずは基本的な使い方をみていきましょう。

実行結果(./rubyflie.log):

以上のように、Logger.newでloggerオブジェクトを作成した後は、loggerのdebug、info、warn、error、fatal、unknownメソッドを使ってログレベルごとに適したフォーマットでログが出力できます。

また、これらの出力のフォーマットはloggerによりカスタマイズできます。

loggerの出力のフォーマットのカスタマイズ方法は、以降の章で解説していきます。

loggerの基本的な使い方

基本的なlogの出力方法

loggerの基本的な使い方を見ていきます。

以下のサンプルコードでは、先頭の方でloggerオブジェクトを生成しています。

その後、テキストファイルを読み込み、テキストファイルの各行を1行ずつ読み込んでいます。

各行の行頭が#で始まっていない場合は、エラーとみなし、loggerオブジェクトを使ってログに出力しています。

エラーでなければ、putsで標準出力に行を表示しています。

実行結果(./filescan.log):

以上のようにログには「スキャンエラー」の文言とともに、エラーとなった行のテキストが書き出されています。

ログレベルはerrorにしています。

ログの出力先指定

ログの出力先を指定することができます。

出力先は主にファイルですが、標準出力(STDOUT)標準エラー出力(STDERR)なをも指定することができます。

実際のサンプルコードをみていきましょう。

実行結果(標準出力・標準エラー出力):

実行結果(tofile1.log):

実行結果(tofile2.log):

以上のような実行結果になりました。

標準出力と標準エラー出力にもログを出力できています。

標準出力にログを出力する場合は、Logger.newメソッドに「STDOUT」を指定します。

標準エラー出力にログを出力する場合は、Logger.newメソッドに「STDERR」を指定します。

ファイルにログを出力する場合は、Logger.newメソッドにファイル名を指定します。

File.openメソッドで開いたファイルにログを出力する場合は、Logger.newメソッドにそのファイルのオブジェクトを指定します。

なお、File.openメソッドで開いたファイルにログを出力する場合のみ、ログの先頭のヘッダーは出力されません。

ログレベルの指定方法

ログレベルの指定は、loggerオブジェクトのerror、info、warn、debugなどのメソッドを使用することで、ログレベルをそれぞれERROR、INFO、WARN、DEBUGなどを指定したことになります。

また、ログに出力する最大ログレベルを指定することができます。

これの最大ログレベルをプログラムで切り替えられるようにすることで、例えば本番系のシステムとテスト系のシステムで、ログの出力情報の量や質を変更できます。

ログ最大レベルはLoggerのlevelプロパティLoggerの定数(Logger::WARNなど)を指定することで有効になります。

実際のサンプルコードをみていきましょう。

実行結果(loglevel.log):

以上のように、levelLogger::WARNを指定しました。

ログの優先度レベルは、DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWNの順になるため、上記サンプルコードでは、DEBUGとINFOのログの情報は出力されていません。

また、WARN以上のログレベルであるERRORとWARNのログの情報は出力されています。

スタックトレースに改行をつけてログ出力

ログはデバッグする際に便利な情報です。

ここで、エラーや例外が発生した箇所のスタックトレースをログに出力できれば便利です。

スタックトレースとは、プログラムを実行している時の現在地のメソッド名やローカル変数の情報を、メソッド呼び出しのたびに段を積み上げて(スタックして)保存している情報のことです。

その情報をデバッグ時にプログラムのどのメソッドやローカル変数の情報を得ているか追跡(トレース)しやすいように加工したものを、総称してスタックトレースと言います。

通常、例外のスタックトレースは配列になっています。

そのため、配列のjoinメソッド"\n"をしていて、配列から"\n"で区切られた文字列に変換します。

例外オブジェクトをerrとすると、スタックトレースは「err.backtrace.join("\n")」で、スタックを1行ごとに改行したテキストになります。

この情報をログに出力してみましょう。

実際のサンプルコードは以下のようになります。

実行結果(./filescan2.log):

以上のような実行結果になりました。

ファイル「sample.txt」を1行ごと読み込み、各行が"#"で始まっていなければエラーとして例外を投げています。

例外が投げられると、rescueブロックに処理が移ります。

rescueブロックにて、例外にふくまれるスタックトレースの情報をログに出力しています。

実行結果をみると、スタックトレースの情報を、スタックあたり1行ずつ出力していることがわかります。

これで、エラーの発生箇所がわかりやすくなります。

エラーの発生したファイル名や行番号がわかりますので、デバッグがしやすくなります。

なお、Rubyのrescueについて詳しくは、以下の記事を参照してください。

Rubyの例外処理rescueまとめ|begin/raise/ensure/retry
更新日 : 2018年8月31日

ログのファイルサイズ指定

ログファイルサイズが大きくなると扱いにくくなります。

そのため、Loggerクラスにはログファイルのサイズを指定できます。

また、指定サイズいっぱいになった場合、古くなったログのファイル名を変更してバックアップとして残すこともできます。

バックアップログファイルも多くなりすぎるとディスク容量を圧迫しますので、何世代まで残すか指定でできます。

指定した世代を超えた世代のバックアップログファイルは自動的に削除されます。

実際のサンプルコードをみてみましょう。

以上のように、Loggerのnewメソッドの第2引数に管理する世代、第3引数にログファイルの最大サイズを指定します。

ログのローテーション

前章では、ログのファイルサイズと世代管理の方法を解説しました。

この章では、別の方法でログファイルを管理する方法を解説します。

Loggerのnewメソッドの第2引数に、以下の文字列を渡した場合、期間を決めてログをファイル名変更し、過去のログファイルとします。

文字列意味
'daily'1日ごと
'weekly'1週間ごと
'monthly'1か月ごと

この期間ごとに順繰りにログファイルをバックアップすることを、ログをローテーションさせると言います。

以上のように、Loggerのnewメソッドの第2引数に、ローテーションさせる期間の文字列を指定します。

loggerの応用的な使い方

datetime_formatによる日付フォーマット

loggerオブジェクトのログの日時の出力フォーマットは変更できます。

Loggerクラスのdatetime_formatプロパティに、フォーマット付き文字列を設定すれば、カスタマイズが可能です。

なお、datetime_formatに指定する際、以下のキーワードが使用できます。

キーワード意味
%Y
%m
%d
%H
%M
%S

なお、Rubyの日付のフォーマットとキーワードについて詳しくは、以下の記事を参照してください。

【完全網羅】RubyのTime使い方まとめ
更新日 : 2019年6月6日

実際のサンプルコードをみてみましょう。

実行結果(date_format.log):

以上のように、datetime_formatプロパティにフォーマット文字列を設定することで、ログの日時の出力フォーマットを変更できました。

logのフォーマットの指定方法

ログ情報は日付以外にも全体のフォーマットを変更可能です。

LoggerクラスのformatterプロパティにProcオブジェクトを渡せば、ログ出力時にProcの引数に下記のが渡されます。

変数名意味
severityログレベル
datetime日時
prognameプログラム名
msgログメッセージ

これらの値を使って、ログ情報を好きなようにフォーマットすることができます。

実際のサンプルコードをみていきましょう。

実行結果(log_format.log):

以上のような実行結果になりました。

このように、ログを自由なフォーマットで出力することができます。

loggerシングルトンの例

loggerオブジェクトは何個でも生成することができます。

しかし、loggerオブジェクトが増えると、メモリ容量が圧迫されます。

そこで、一つのloggerオブジェクトを生成し、それを使いまわすことでメモリ容量を消費しないようにできます。

デザイン・パターンと呼ばれるオブジェクト指向プログラミングの設計技法のテンプレートの一つである、シングルトン(singleton)・パターンを使ってみます。

シングルトン・パターンは、プログラム全体の中でオブジェクトがただ一つしなかい(シングル)オブジェクトの使用方法です。

実際のサンプルコードをみていきましょう。

実行結果(./log_singleton.log):

上記サンプルコードでは、まず@@loggerをnil?で初期化しています。

そして、getLoggerが呼ばれた際、@@loggerがnilであればLogger.newメソッドでオブジェクトを生成し、nilでない場合そのまま@@loggerオブジェクトを返しています。

プログラムでは、常にgetLoggerの返値のオブジェクトを使用しています。

プログラム全体では、@@loggerオブジェクトはただ1つです。

その@@logerをプログラ全体で使いまわしています。

これにより、メモリ消費量を抑えることができます。

まとめ

今回はRubyのlogについてついて学習しました!

学習のポイントを振り返ってみましょう!

  • logはプログラムのデバッグ用のデータでloggerオブジェクトを使う
  • logレベルは複数あり重要度に応じてログレベルを指定する
  • スタックトレースをログに出力できる
  • ログファイルサイズ、ログローテーションによりログを世代管理できる
  • ログの出力フォーマットは日付も含めカスタマイズできる
  • loggerはシングルトンクラスを作って管理することもできる

以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

貝原 輝昌

貝原 輝昌

こんにちは!貝原(@touhicomu)と申します。
現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。
現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^
地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。
以下の活動も行っています。
 ・笑楽井石のブログ
 ・エクセル関数を日本語化するソフト
 ・エクセルVBAを日本語で記述するソフト

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説