14

Log4perlは、ロギング用の優れたツールです。

warningsプラグマも不可欠なツールです。

ただし、Perl スクリプトがデーモンとして実行されている場合、Perl の警告は、関連するプログラムの Log4perl ログ ファイルではなく、誰も見ることができない STDERR に出力されます。

Perl の警告を Log4perl ログに記録する方法はありますか?

たとえば、次のコードは問題なくログ ファイルに記録されますが、これがデーモンとして実行された場合、Perl の警告はログに含まれません。

#!/usr/bin/env perl
use strict;
use warnings;

use Log::Log4perl qw(get_logger);

# Define configuration
my $conf = q(
                log4perl.logger                    = DEBUG, FileApp
                log4perl.appender.FileApp          = Log::Log4perl::Appender::File
                log4perl.appender.FileApp.filename = test.log
                log4perl.appender.FileApp.layout   = PatternLayout
);

# Initialize logging behaviour
Log::Log4perl->init( \$conf );

# Obtain a logger instance
my $logger = get_logger("Foo::Bar");
$logger->error("Oh my, an error!");

$SIG{__WARN__} = sub {
    #local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
    $logger->warn("WARN @_");
};

my $foo = 100;
my $foo = 44;

これはまだSTDERRに出力されます:

"my" variable $foo masks earlier declaration in same scope at log.pl line 27.

また、ログ ファイルはこの警告をキャッチしません。

4

2 に答える 2

15

WARNこれを行うためにハンドラーをインストールできます。Log4perlFAQに記載されています

私のプログラムはすでにwarn()とdie()を使用しています。Log4perlに切り替えるにはどうすればよいですか?

プログラムがすでにPerlのwarn()関数を使用してエラーメッセージを吐き出し、それらをLog4perlの世界に送りたい場合は、プログラムまたはモジュールが存在するWARNハンドラーを定義するだけです。

use Log::Log4perl qw(:easy);
$SIG{__WARN__} = sub {
    local $Log::Log4perl::caller_depth =
        $Log::Log4perl::caller_depth + 1;
    WARN @_;
};

これによりwarn、プログラムでの明示的な使用や、初期化されていない値の使用に関するPerlishの警告などがキャプチャされます。

于 2010-01-17T17:21:26.950 に答える
10

一部のモジュールがメッセージをSTDERRに出力するため、Log4perlFAQにあります。それらをLog::Log4perlにファネルするにはどうすればよいですか?私のプログラムはすでにwarn()とdie()を使用しています。Log4perlに切り替えるにはどうすればよいですか?

特定の問題には、コンパイル時の警告が表示されるという追加のしわがあります。そのため、FAQのアドバイスを調整して、コンパイル時にできるだけ早くログを設定する必要があります。BEGINあなたが立つことができるのと同じくらいソースの上部に近いブロックでそれをしてください:

 BEGIN {
     ... all of your logging setup
     }

警告を有効にして構文チェックを実行することで、コンパイル時の警告かどうかを判断できます。

 % perl -cw program

構文チェック中に警告が表示された場合は、コンパイル時の警告です。

ただし、開発中のコンパイル時の警告をキャッチしたいと思います。彼らは本番システムに到達するべきではありません。:)

于 2010-01-17T17:23:48.383 に答える