Movable Type のシステムログをpre要素で出力する(デバッグに便利)
目次
Movable Type のプラグインを作っているとき、変数の内容などをシステムログに書き出して確認することが多々あります。
システムログに書き出すには、プラグインのファイル(.pmなど)に以下のコードを書きます。実際はログに書き出すコードをサブルーチンにまとめておいて利用します(それについては省略します)。
require MT::Log;
my $msg01 = 'システムログに書き出します。';
my $log = MT::Log->new;
$log->message($msg01);
$log->save;
こうすると、[システムメニュー > ツール > ログ] に書き出されます。

一つの項目を確認したいときはこれで構いませんが、複数の項目を書き出すときにはちょっと具合が悪いです。一つ一つログに書き出すのは面倒だし、結果もソースコードも見にくかったりします。そこで、複数の項目のときは、ヒアドキュメント使ってまとめて書いちゃえば便利かな、と思いました。
例えば次のような感じです(以下の場合、Dumper で $blog を出力すれば済むかも知れませんが、それは置いておいて)。
require MT::Log;
my $blog = $app->blog;
my $blog_id = $blog->id;
my $blog_name = $blog->name;
my $blog_url = $blog->site_url;
my $msg = <<__TINYBEANS__;
ブログID: $blog_id
ブログ名: $blog_name
ブログURL: $blog_url
__TINYBEANS__
my $log = MT::Log->new;
$log->message($msg);
$log->save;
しかし、残念ながらこれだと出力結果は次のようになり、想定している改行が反映されません。

じゃあ、pre 要素で出力できれば改行も反映されるのでは?ということで、システムログを pre 要素で出力してみます。
MT::Log は metadata に値を設定すると、message に設定した値がシステムログの概要として出力され、それをクリックすると metadata で設定した値が pre 要素で表示されるようになります。
先ほどのコードの場合、次のようになります。
require MT::Log;
my $blog = $app->blog;
my $blog_id = $blog->id;
my $blog_name = $blog->name;
my $blog_url = $blog->site_url;
my $msg = <<__TINYBEANS__;
ブログID: $blog_id
ブログ名: $blog_name
ブログURL: $blog_url
__TINYBEANS__
my $log = MT::Log->new;
$log->message('表示中のブログの情報');
$log->metadata($msg);
$log->save;
こうすると、次の画像のようになります。

あれ?想定していたように改行が反映されません。。。
じゃあ、もう最初から div じゃなくて pre にしよう、ということで、lib/MT/Log.pm をカスタマイズしてしまいます。Log.pm の 106行目から117行目付近(MT5.1rc2)の以下のコードを、
return $desc
? qq{
}
: qq{
};
次のように div から pre にカスタマイズします。
return $desc
? qq{
}
: qq{
};
こうすることで、metadata も設定するクリッカブルな方も普通の message だけの方も最初から pre 要素で出力され、改行も反映されました。

以上です。もっと簡単な方法ないのかな。。。