Log::Dispatch::Screen::Color で色つきログでデバッグ!B!

おはこんばんちは! 絶賛無職中の vkgtaro です。おちこんだりもしたけれど私は元気です!
今日はアプリケーションには欠かせないログに色をつけるよ!

Log::Dispatch

Log::Dispatch はログの出力先を標準エラーやファイルへの書き込み、メールで飛ばしたり、DBI で DB に突っ込んだり、と Log::Dispatch::* を指定して切り替えられる便利 logger です。

use Log::Dispatch;
use Log::Dispatch::File;

my $dispatcher = Log::Dispatch->new;
# ファイルへの出力
$dispatcher->add(
    Log::Dispatch::File->new(
        name      => 'file1',
        min_level => 'debug',
        filename  => 'logfile',
        mode      => 'append'
    )
);

$dispatcher->log( level => 'alert', message => 'Advent Calendar の締め切りが近い! >_<');
# => logfile に Advent Calendar の締め切りが近い! >_< と追記される

使いたい Log::Dispatch::* オブジェクトを add メソッドでどんどん追加できます。

use Log::Dispatch::Screen;

# Screen への出力も追加
$dispatcher->add(
    Log::Dispatch::Screen->new(
        name      => 'screen',
        min_level => 'debug',
        stderr    => 1
    )
);
$dispatcher->log( level => 'warning', message => 'ファイルと画面に出力されるよ');
# => 標準エラーに出力されつつファイルにも出力されます。

min_level はその Log::Dispatch::* オブジェクトが出力する最小のレベルです。max_level というオプションもあって、そちらは最大のレベルですね。

use Log::Dispatch;
use Log::Dispatch::Screen;

my $dispatcher = Log::Dispatch->new;

# min_level notice
$dispatcher->add(
    Log::Dispatch::Screen->new(
        name      => 'screen1',
        min_level => 'notice',
        stderr    => 1
    )
);

# max_level error
$dispatcher->add(
    Log::Dispatch::Screen->new(
        name      => 'screen2',
        min_level => 'debug',
        max_level => 'error',
        stderr    => 1
    )
);

$dispatcher->log( level => 'warning', message => 'notice ~ error なので2回表示される');
$dispatcher->log( level => 'debug', message => 'notice 以下なので1回だけ');
$dispatcher->log( level => 'emergency', message => 'error 以上なので1回だけ');

Log::Dispatch::Config

Log::Dispatch::Config を使うと Log::Dispatch::* オブジェクトの追加とかを Config に書き出せておけます。

プログラムの方はこんな感じで書いておいて、

use Log::Dispatch::Config;

Log::Dispatch::Config->configure('log.conf');
my $dispatcher = Log::Dispatch::Config->instance;
$dispatcher->debug('デバッグログですよ');

指定した設定ファイルの方を以下の様に書くと

dispatchers = file screen

file.class = Log::Dispatch::File
file.min_level = debug
file.filename = logfile
file.mode = append
file.format = [%d] [%p] %m at %F line %L%n

screen.class = Log::Dispatch::Screen
screen.min_level = debug
screen.stderr = 1
screen.format = %m

最初に示した例と同じようにファイルと標準エラーへの出力がされます。
dispatchers には用意した設定で使わない設定を外すとその設定は使用されなくなります。便利ですね。

Log::Dispatch::Config はいくつかの Configurator があるので XML や YAML 形式でも使えます。

Log::Dispatch::Screen::Color

さて本題です!

色々書いてるうちに Log::Dispatch の話題がほとんどになってしまいましたが、Log::Dispatch::Screen::Color で色をつけて終わりにしましょう。

せっかくなので Log::Dispatch::Configurator::YAML を使って YAML で設定を示しましょう。

use Log::Dispatch::Config;
use Log::Dispatch::Configurator::YAML;

my $config = Log::Dispatch::Configurator::YAML->new('log.yaml');
Log::Dispatch::Config->configure($config);
my $log = Log::Dispatch::Config->instance;

設定はこんな感じ。

dispatchers:
  - color
color:
  class: Log::Dispatch::Screen::Color
  min_level: debug
  stderr: 1
  format: '[%d] [%p] %m at %F line %L%n'
  color:
    info:
      text: green
    warning:
      text: yellow
    error:
      text: red
    alert:
      text: red
      background: white
      bold: 1

そしてログを吐いてみます。

$log->info('info message is green!');
$log->warning('warning message is yellow!');
$log->error('error message is red!');
$log->alert('alert message is red on white!');

色ついた!

http://vkgtaro.jp/img/jperl_advent_calendar_2009/log_color.png

ログに色がつくと開発時とかわかりやすくて良いです。

ちなみに Log::Dispatch で色をつけるモジュールは拙作の Log::Dispatch::Colorful なんてのもありますが、こっちは変数の dump もしたくて Log::Dispatch 自体にも手を加えてしまい、他の Log::Dispatch::* との共存がしづらくなります。

色をつけたいだけなら、Yappo さん作のこの Log::Dispatch::Screen::Color をお薦めします。Windows 環境でも色が着くようです。

Catalyst でお手軽に色をつけたければ Catalyst::Plugin::Log::Colorful なんてのもあります。

Term::ANSIColor 使えばエスケープシーケンスを意識しなくても出力に色がつけられるので、他の Logger で色つけたいという方はモジュール作ってみてはいかがでしょうか!
(Log::Dispatch::Screen::Color は Win32::Console::ANSI 使って windows 対策してますね)

http://vkgtaro.jp/img/jperl_advent_calendar_2009/nobjas_san.png