Perlでは、どの.plスクリプトがモジュールのこのインスタンスを初期化したかを知る方法はありますか?
Log4perl
具体的には、オブジェクトを持つモジュールを呼び出すスクリプトの名前を取得したいと思います。そうすれば、モジュール内でどの.logファイルに書き込みたいかがわかります。
私はこれを間違っていますか?$logger
.plスクリプトでを定義した場合$logger
、モジュール内の呼び出しは、呼び出し元のスクリプトと同じ.logファイルに書き込みますか?
私はまだサンプルコードを持っていませんが、を読んでいLog4perl
ます。基本的にcaller.log
、呼び出し元のスクリプトのファイルアペンダーであるファイルにアペンダーを設定した場合caller.pl
、カスタムインポートされたモジュールで定義されたログも書き込みますcaller.log
(暗黙的に、可能であれば-明らかに私はできます)モジュールインスタンスを初期化するときに、ログ名の名前を渡すだけです)。
これは、モジュールが書き込むファイルアペンダーを指定する引数を渡さなくても可能ですか?1つのインスタンスLog4perl
だけを使用しませんか?$logger
また、私が道を外れているかどうか、また別のアプローチがある場合は検討する必要があるかどうかを知らせてください。
ありがとうございました
編集:申し訳ありませんが、これを投稿した後、関連リンクを確認しましたが、検索の文言が正しくなかったと思います。これはかなり良い解決策のようです:Perlモジュールのセルフロギング(Mooseなし)
他に何かアイデアがあれば教えてください。
編集2:最終的にテストし、私が望んでいたように動作させるようにしました-それを実現するよりもはるかに簡単でした!
これが私の設定です。
Module.pm
package Module;
use Log::Log4perl qw(get_logger :levels);
use Data::Dumper;
my $logger = get_logger("Module");
sub new {
my ($class, $name) = @_;
my @caller = caller(0);
$logger->debug("Creating new Module. Called by " . Dumper(\@caller));
my $object = { 'name' => $name };
return bless($object, $class);
}
caller.pl
use Module;
use Log::Log4perl qw(get_logger :levels);
use Data::Dumper;
my $PATH = "$ENV{'APPS'}/$ENV{'OUTDIR'}";
my $SCRIPT = "caller";
my $logger = get_logger("Module");
$logger->level($DEBUG);
my $file_appender = Log::Log4perl::Appender->new("Log::Dispatch::File",
filename=> "$PATH/$SCRIPT.log",
mode => "append",);
$logger->add_appender($file_appender);
my $layout = Log::Log4perl::Layout::PatternLayout->new("%d %p> %F{1}:%L %M - %m%n");
$file_appender->layout($layout);
my $lib = Module->new('Chris');
$logger->info(Dumper($lib));