perlでロギングするための入門
今回は、perlでロギングを行うためのlog4perlの入門編を実施したいと思います。
なぜロギングか
私は以前、JavaでのWeb開発をおこなっていましたが、その際にロガーは欠かせないものでした。
そこでは、いろいろと問題があるものの、log4jという比較的高速なロガーをつかっていました。(いろいろな問題の一つは、マルチプロセスなプログラミングに対応していないことに起因していて、はまると大変です)
JavaでもPerlでも、開発時にプログラムの要所要所でロガーの出力する値を確認することで、スピーディーに開発をすすめることができます。ロガーを使ったあとで、使わずに開発をするということは、目隠しをされてプログラムをしろといわれているようなものだと感じることでしょう。
そこで今回は、perlでのロギング入門をしたいと思います。
perldocを読めばわかりますが、ロギングについて詳しくない人には、ちょっとしたコツがわかるサイトが必要なものです。
ここでは、簡単なロギングのノウハウも一緒に話してみたいと思います。
簡単なコード
まず、一番簡単なロギングの方法ですが
use Log::Log4perl;
Log::Log4perl->init('/home/hoge/log4perl.conf');
my $log = Log::Log4perl->get_logger();
$log->debug('message');
のようなコードになります。
最初のuse Log::Log4perl;は、ロガーのパッケージを読み込む指定をしています。
次のLog::Log4perl->init('log4perl.conf');でlog4jの設定ファイルlog4per.confから設定を読みとっています。
次に、my $log = Log::Log4perl->get_logger();でロガーオブジェクトを生成しています。このメソッドは、関数毎に毎回つくることをお勧めします。(ロガーを引数で渡すことは推奨されていません)
最後に$log->debug('message');でデバッグレベルのメッセージを出力しています。
ログのレベルとしては、トレース(trace)、デバッグ(debug)、情報(info)、警告(warn)、エラー(error)、致命的エラー(fatal)があります。
それぞれ、出力すべきログの用途によってレベルを使いわけます。
| 種類 | メソッドの名前 | 概要 |
|---|---|---|
| 致命的エラー | fatal | それ以上アプリケーションが動作をその場で停止しなければならず、異常な状態であることを伝えるために利用。 |
| エラー | error | アプリケーションは動作しつづけられるが、異常な状態であることを伝えるために利用。 |
| 警告 | warn | アプリケーションは動作しつづけられ、問題である可能性があることを伝えるために利用。 |
| 情報 | info | アプリケーションが正常に処理されていることを伝えるために利用。 |
| デバッグ | debug | デバッグ時に利用。特に、単体試験レベルでの確認等に利用 |
| トレース | trace | 開発時に利用。 |
設定ファイル
では、出力したログをコンソール画面に出力する設定ファイルの例を紹介します。
log4perl.rootLogger = DEBUG, Screen
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout
まず最初の行のlog4perl.rootLoggerは、このロガーのデフォルトのの出力ログレベルと、出力先を指定しています。
DEBUGがログを出力するレベルで、DEBUG以上のログレベルのログ(トレース以外)を出力することになります。
Screenはアぺンダーと呼ばれるログの出力先の設定の名前です。この設定は、カンマ区切りで複数追加することもできます。
次の行のlog4perl.appender.Screen = Log::Log4perl::Appender::Screenは、あるアペンダー名に、用意されているアペンダーモジュールを設定する行になります。
形式としては、log4perl.appender.[アぺンダー名]=[アペンダのモジュール名]という形になります。
ここで指定しているLog::Log4perl::Appender::Screenはコンソール画面にログを出力するモジュールです。
最後の行のlog4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayoutは同様に、ログを出力する際の、出力フォーマットを決めるモジュールを指定しています。
ここで指定しているLog::Log4perl::Layout::SimpleLayoutは、簡単にログ出力したい際に利用するモジュールです。
設定ファイルに切り出すことのメリットは、ログの出力方法を設定ファイルに切り出すことで、ファイルや画面、LOGサーバなど、ログに関する出力先の変更を後で簡単に行えるという点です。
ちょっと気をつけるべき点
log4jでもそうでしすが、デバッグログを出力する際などは、特に気をつけるべき点があります。
最も気をつけるべきなのは、デバッグログの生成が重い場合です。
$log->debug(heavy_msg_gen());
こういった場合、デバッグログが設定ファイルで出力されない設定でもheavy_msg_gen()が呼び出されてしまいます。
そういう場合には、下記のように、$log->is_debug()の値によって、ロガーを呼び出すかどうかを制御してやります。こうすることで、デバッグログが設定ファイルでオフになっている場合は、heavy_msg_gen()を実行することがなくなります。
if ($log->is_debug()) {
$log->debug(heavy_msg_gen());
}
ロガーの出力を行う場合には、統一的にこのような記述をこころがければ、debugログをオフにしても処理が重いということはなくなります。
以上でログ出力入門とします。
また、なにか面白いネタがあれば、yakanなどで取り上げていきたいと思います。