PerlでWebアプリをつくる際に困るのが、ブラウザ上の画面からはInternal Server Errorということしかわからないということです。
Webサーバのerror_logを見ればもうちょっと細かく何が起こったか把握することが可能ですが、やはり情報が少ないです。
そのようなときはログを出力することによって、たくさんの情報を取得することができるようになります。
ログ出力の重要なことは、出力するメソッドと出力する内容です。
ログ出力をするメソッドはファイルに出力するだけであれば以下のようになります。
オブジェクト指向で作っている場合はこのメソッドをたくさんのクラスに書く必要があるかもしれません。
そのような際はUNIVERSALメソッドにすることによって集約することができます。
UNIVERSALメソッドは任意のクラスに"UNIVERSAL::メソッド名"というようなメソッドを定義することによってどのクラスから呼ばれても呼び出すことが可能なメソッドを作成することができます。
しかし、UNIVERSALメソッドは別モジュールとのメソッド名の衝突や、どこのクラスから呼び出されているかわからなくなるデメリットがあるのでむやみに使うことはやめた方がいいでしょう。
次に出力される内容をわかりやすくするためにData::Dumperを使います。
Data::Dumperは配列やハッシュといったものも視覚的にわかりやすく表示することが可能です。
たとえば、配列のリファレンスの各要素にハッシュのリファレンスが格納されているデータは以下のように表示されます。
このように見やすい形でログを出力できるようにしておくことでより効率的に開発を行うことが可能になります。
Webサーバのerror_logを見ればもうちょっと細かく何が起こったか把握することが可能ですが、やはり情報が少ないです。
そのようなときはログを出力することによって、たくさんの情報を取得することができるようになります。
ログ出力の重要なことは、出力するメソッドと出力する内容です。
ログ出力をするメソッドはファイルに出力するだけであれば以下のようになります。
sub log {上記のメソッドでは、ただファイルに文字が出力されるだけなので使いやすくするには日時などを出力できるようにします。
my @str = @_;
my $logfile = <ログファイルパス>;
open LOG, "$logfile" || return 0;
print LOG join '' @_;
close LOG;
return 1;
}
オブジェクト指向で作っている場合はこのメソッドをたくさんのクラスに書く必要があるかもしれません。
そのような際はUNIVERSALメソッドにすることによって集約することができます。
UNIVERSALメソッドは任意のクラスに"UNIVERSAL::メソッド名"というようなメソッドを定義することによってどのクラスから呼ばれても呼び出すことが可能なメソッドを作成することができます。
しかし、UNIVERSALメソッドは別モジュールとのメソッド名の衝突や、どこのクラスから呼び出されているかわからなくなるデメリットがあるのでむやみに使うことはやめた方がいいでしょう。
次に出力される内容をわかりやすくするためにData::Dumperを使います。
Data::Dumperは配列やハッシュといったものも視覚的にわかりやすく表示することが可能です。
たとえば、配列のリファレンスの各要素にハッシュのリファレンスが格納されているデータは以下のように表示されます。
$VAR1 = [
{
'name' => 'foo',
'age' => 30
},
{
'name' => 'bar',
'age' => 22
}
];
このように見やすい形でログを出力できるようにしておくことでより効率的に開発を行うことが可能になります。