log4perlのconfigファイル loggerに関して

Michael Schilli / Log-Log4perl - search.cpan.orgのconfigファイルに関してのメモ。
主にrootLoggerとかloggerの指定のところ。

設定ファイルを用意

#  log4perl.rootlogger = DEBUG, A1
    log4perl.rootLogger = DEBUG, A1
    log4perl.appender.A1 = Log::Log4perl::Appender::Screen
    log4perl.appender.A1.layout = Log::Log4perl::Layout::SimpleLayout

先頭 # でコメント行
rootLoggerは小文字でも大丈夫だった。
これを「log4perl.conf」として保存。

テストスクリプトを用意

設定ファイルを読み込んでテストログを出力するスクリプトが以下。

#!/usr/bin/env perl

use strict;
use warnings;

use Log::Log4perl;

my $logger = do {
    Log::Log4perl->init('log4perl.conf');
    Log::Log4perl->get_logger();
};

$logger->debug('debug');
$logger->info('info');
$logger->warn('warn');

DEBUG - debug
INFO - info
WARN - warn

loggerの追加とappender

log4perl.confに以下の1行を追加

log4perl.logger.hoge = WARN, A1

これで、get_loggerの引数に「hoge」を指定することでWARN出力になるとおもっていたが少し違った。

WARN - warn
WARN - warn

warn2個でた。
log4perlのappenderは指定した数だけログを吐く仕様っぽい。
つまり、もともとrootloggerでA1を指定していたところへ、hogeでさらにかぶせて指定したので2回はかれた。

解消するにはadditivity

2個出さないようにする、rootLoggerの設定を継承しないようにするにはloggerに対してadditivityの値を0に。

log4perl.logger.hoge = WARN, A1
log4perl.additivity.hoge = 0

get_loggerの引数はパッケージ形式で呼び出せる

例えばloggerを以下のようにセット

log4perl.rootLogger = INFO
log4perl.logger.hoge.fuga = WARN, A1

hoge.fuga」のルールをとってくるのに以下の2通りの方法がある。

Log::Log4perl->get_logger('hoge.fuga');
Log::Log4perl->get_logger('hoge::fuga');

上記のようにパッケージ形式での指定が可能。
特に意味ないけど

package hoge::fuga;
Log::Log4perl->get_logger(__PACKAGE__);

とか