一瞬、Perlの小枝(コエダ)って書いたような気がした(^^;、コワザですよ、コザワ。
さて本題、先日メンテナンスを頼まれたPerlのプログラムで、ログを取得する方法として、面白いコードあったので、ちょっと紹介します。
[ex01.pl]
BEGIN {
open WRNOUT, ">>ex01.wrn.txt";
open FTLOUT, ">>ex01.err.txt";
# WARN(警告メッセージ)時の処理を上書き
$::SIG{__WARN__} = sub{
my ($s, $min, $h, $d, $m, $y) = (localtime(time))[0..5];
my $time = sprintf("[%04d/%02d/%02d %02d:%02d:%02d]",
$y+1900, $m+1, $d, $h, $min, $s);
print WRNOUT "$time $_[0]";
};
# DIE(error)時の処理を上書き
$::SIG{__DIE__} = sub{
my ($s, $min, $h, $d, $m, $y) = (localtime(time))[0..5];
my $time = sprintf("[%04d/%02d/%02d %02d:%02d:%02d]",
$y+1900, $m+1, $d, $h, $min, $s);
print FTLOUT "$time $_[0]";
}
}
warn "TEST 01";
sleep 5;
warn "TEST 02";
sleep 5;
die "FATAL";
警告メッセージ用とエラーメッセージ用の二つのファイルをオープンします。
dieとwarnのハンドラをそれぞれ入れ替えます。ここでは、エラーの発生時刻を一緒に出力するようにしてあります。
出力ファイル1
[ex01.err.txt]
[2010/07/30 14:26:14] FATAL at C:\********\ex01.pl line 27.
出力ファイル2
[ex01.wrn.txt]
[2010/07/30 14:26:04] TEST 01 at C:\********\ex01.pl line 23. [2010/07/30 14:26:09] TEST 02 at C:\********\ex01.pl line 25.
このようにwarnやdieの処理を書き換えることで、時間を記録したり、その他必要な事項を出力することができます。必要に応じて同時に他のデバイスに出力するなど処理も可能になります。プログラム全体に散らばったwarnやdieを直接書き換えるのでなく、根元を書き換え可能というのは便利ですね。
(yna / 2010/08/03)