apacheのerror_logで日本語が化けるのに困ってるなら

subversionをWebDAV経由で利用すると何かエラーが発生した場合apacheのエラーログに記録されますが、subversionのエラーメッセージはUTF-8なので、apacheのエラーログに記録される段階で普通、日本語部分が文字化けします。

つい今しがた、ちょうどsubversionでの処理がトラぶって結構困ってたのでapacheのエラーログの文字化け部分を日本語に復元するPerlスクリプトを作ってみました。

use strict;
use warnings;
use File::Spec;

my $logfile = shift @ARGV or die "Please appoint a log-file.";

die "Cannot find logfile, $logfile" if !-f $logfile;

my($vol, $dir, $file) = File::Spec->splitpath($logfile);

my $outfile = './'. $file .'-jp.txt';

open my $in,  "<", $logfile or die "File open error, $logfile";
open my $out, ">", $outfile or die "File open error, $outfile";
while (<$in>) {
    s{\?\\([a-f\d]{3})}{chr($1)}ieg;
    s{\\x([a-f\d]{2})}{pack("C", hex($1))}ieg;
    print {$out} $_;
}
close $in;
close $out;

print 'Finished. ' .localtime() ."\n";

1;

このスクリプトを適当な場所に置いて(便宜上、jp_log.plと名付けておきます)、

perl jp_log.pl /usr/local/apache2/logs/error_log

を実行すると(引数で指定したエラーログが存在する and jp_log.pl実行者がエラーログの読込み権限を持ってるなら)、 jp_log.plと同じ場所に「”エラーログ名” .”-jp.txt”」という命名ルールで復元処理後のエラーログを作ってくれます。多分。

手元で実際に困って作ったスクリプトなので、その手元の環境(MacOS X 10.4)で動くことが前提・UTF-8限定で、Windowsサーバとかは全然想定してませんが、お役に立つようでしたら、どうぞ。