2016-05-12 16 views
1

スクリプトからPerl変数をLog :: Log4perl設定ファイルで使用したいと思います。私はドキュメントを読んで、サブルーチンを使うことができることを発見しましたが、できるだけ簡単にやりたいと思います。私はアペンダのファイル名を設定したいLog :: Log4perl設定ファイルでPerl変数を使用するにはどうしたらいいですか?

log4perl.appender.av_std_LOGFILE.filename="whateverfilename.log" 

しかし、これをこのようにやって、それが固定値です。

私は私のスクリプト内の変数にファイル名を持っていると、実行時にこれを使用したいと思います:

これはサブルーチンである
log4perl.appender.av_std_LOGFILE.filename=\ 
sub { return &av_getLogfileName(); } 

sub av_getLogfileName 
{ 
    return $av_std_LOGFILE; 
} 

これは動作しますが、私は希望戻り値が非常に簡単であるので、私のスクリプト内のサブを避けるために。

documentationは言う:

だから私が何かをしようとした

sub {...は、アプリケーションが設定を解析時に実行されるPerlコードとして解釈される文字列で始まる各値...このように動作しませんでした:

log4perl.appender.av_std_LOGFILE.filename=\ 
    sub { print "$av_std_LOGFILE"; } 

変数の結果を取得する方法はありますか私のスクリプトの中にサブがない?成功した場合に

+0

'$ av_std_LOGFILE'は、スクリプトで2回、モジュールが2回設定されています。どちらですか? – ThisSuitIsBlackNot

+0

また、それが何であるか分からない限り、 '&'でサブルーチンを呼び出すべきではありません。 'return av_getLogfileName();'は 'return av_getLogfileName();'(あるいはより良いですが 'av_get_logfile_name();'でなければなりません。ありがとうございます; – ThisSuitIsBlackNot

答えて

4

print 1を返し、そう

sub { print "$av_std_LOGFILE"; } 

1を返し、ない$av_std_LOGFILEの値。 fully qualify variable names in hooksもある必要があります。つまり、$av_std_LOGFILEをグローバルパッケージにする必要があります。

はにあなたのフックを変更

sub { return $main::av_std_LOGFILE; } # double quotes are unnecessary 

と(Log::Log4perl::initを呼び出す前に)このようなあなたのスクリプトで$av_std_LOGFILEを設定:一般

our $av_std_LOGFILE = '/path/to/logfile'; 

、あなたはグローバル変数を避ける必要がありますので、私は使用して希望しますサブルーチン。

+0

;エラーメッセージが表示されます:/home/fx42252/perl5/lib/perl5/Log/Log4perl/Appender/File.pm 124行目の/home/fx42252/perl5/libに、開くことができません(Datei oder Verzichnis nicht gefunden)。 /perl5/Log/Log4perl/Appender/File.pm 129. – averlon

+0

パッケージ 'main'に' $ av_std_LOGFILE'を設定していないか、 'Log :: Log4perl :: init'を呼び出した後で設定していますか。変数をモジュール内に設定する場合は、モジュールのパッケージ名を使用する必要があります。あなたのモジュールコードが '' package Foo :: Bar;私たちの$ av_std_LOGFILE = '/ foo'; 'あなたのフックは' sub {return $ Foo :: Bar :: av_std_LOGFILE; } ' – ThisSuitIsBlackNot

+0

は" module "という表現をスキップできます。私は今までbashスクリプトを置き換えるためにperlを使用しています。ですから、パッケージ、モジュール、などのような構造は本当にありません。私が今まで理解したことは、perlを使って、それはすべて "main ::"です。わからない。 とにかく:変数がinitの使用時にセットされていることを確かめることができます。 – averlon

関連する問題