問題タブ [log4perl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - Log4perlログファイルの二重出力
私は、データベースに送信されているコマンドをログに記録できるようにする、既存のPerlコードベースの新機能に取り組んでいます。私はLog4perlに基づいてソリューションを作成しているため、複数のホイールを再発明する必要がありません。
残念ながら、私は問題にぶつかっています。すべてのメッセージがログファイルに2回送信されます。それをやめたいのですが。
私の調査(Google)は、同じメッセージを2つの異なるログファイルに送信することは一般的な問題であると示していますが、それは私が見ていることではありません。すべてのメッセージは、単一のログファイル内に2回表示されます。
この動作を修正する方法を探すためのヒントはありますか?
編集: 設定ファイルは次のようになります:
これが素敵な.confファイルだったらいいのにと思いますが、既存のコードで作業しています。
perl - オブジェクトとLog4perlのディープクローン作成
Storableを使用してdclone()
、さまざまな複雑なオブジェクトのコピーを作成しています。これらのオブジェクトは、Log4perlロガーが接続された状態で自己ロギングします。Storableは、参照を含んでいるため、ロガーオブジェクトに遭遇すると文句を言いますCODE
。コード参照をシリアル化するオプションをオンにすると、不吉な警告が表示されます
クローン作成プロセス中に、クローン作成されたオブジェクトのロガーが機能しなくなります。
私が複製しているオブジェクトは他のオブジェクトで構成されており、ロガーはオブジェクト、そのコンポーネント、それらのサブコンポーネントなどにアタッチされている可能性があります。
理想的には、クローン作成プロセスでロガーオブジェクトを無視するようにします。
1)このタスクに(もっと)適しているPerlモジュールはありますか?理想的には、再帰コピーを制御して、ロガーではないオブジェクトまたはデータの一部のみがコピーされるようにしたいと思います。
2)...または、オブジェクトのセルフロギング機能(sob!)をオブジェクトから取り出して、オブジェクトに接続されていないロガーを作成する方がよいでしょうか?
アドバイスや洞察をいただければ幸いです。
perl - 異なるlog4perl構成を切り替える方法は?
スクリプトとオブジェクトのセットでlog4perlを使用しています。コマンドラインまたは環境パラメータに応じて異なるロギング構成を切り替えられるようにしたいと思います。たとえば、「verbose」モードでは、INFOレベル以上のすべてのメッセージを出力し、「debug」モードはDEBUGメッセージをSTDERRおよびその他のメッセージに送信します。 STDOUTに変換し、FATALメッセージを除くすべての出力を抑制するサイレントモード。
これを行うための最良の方法は何ですか?スクリプトを実行するモードに応じて、いくつかのロガー構成ファイルを用意し、適切なファイルをロードする必要がありますか?ドキュメントを正しく理解している場合は、ルートロガーの詳細度としきい値を変更して、オブジェクトに接続されているすべてのロガー(つまり、カテゴリを持つロガー)がルートロガーと同じルールに従うようにします。
perl - 不要になった Log4perl ロガーを破棄する
パッケージの一部として Log4perl を使用して、特定の DBI 接続が何をしているかをキャプチャしています。私の現在の計画は、 を介して、接続ごとに新しいロガー オブジェクトを作成することですLog::Log4perl->get_logger($mysql_connect_id)
。これにより、さまざまな接続が互いに台無しにすることなく、異なるファイルまたは同じファイルに書き込むことができるようになります。
私の懸念は、接続が切断され、そのロガーが不要になったときに何が起こるかということです。Log4perl がこれらのロガーを無期限に保持するだけの場合、メモリ リークのレシピのように思えます。
ロガーが役に立たなくなったと確信した後、ロガーを取り除く最良の方法は何ですか? あるいは、逆に、これは問題でもありますか? Log4perl には、この種のリークを既に防止する何らかの組み込みの処理メカニズムがありますか?
編集: 質問のコメントで言及されていますが、おそらくここで言及する価値があります: Log::Log4perl::Logger には
DESTROY
有望と思われる方法があります。ただし、それは文書化されておらず、「文字列 eq で初期化されていない値を使用しています」という警告が大量にスローされるため、注意が必要です。ハックのように感じます。(しかし、それが最善/唯一の方法である場合、「特定のパッケージからの特定の警告をオフにするにはどうすればよいですか?」という質問になると思います)
perl - Perl の Log::Log4perl のログ レベルは、構成を更新せずに動的に変更できますか?
Log::Log4perl を使用している mod_perl で Mason テンプレートを実行しています。
特定のアペンダーのログ レベルを変更したいのですが、構成を変更するのは面倒です。デプロイ プロセスを通過してライブに移行する必要があるからです。
構成ファイルを変更せずに、Apache の起動後に実行時にアペンダーのログ レベルを変更し、その変更を新しい Apache スレッドに影響させる方法はありますか?
perl - Perl でシェル スクリプトのコンソール出力を読み取る
print_error.sh
次のようなシェル スクリプトがあるとします。
今、私は Perl スクリプトを使用しており、このシェル スクリプトを次のように呼び出しています。
のコンソール出力を読み込んでLog4perlロガーprint_error.sh
に書き込もうとしています。
どうすればこれを達成できますか?
perl - Log :: Log4perl :: INFOをモックするにはどうすればよいですか?
私は次のようなものを使用する既存のモジュールの新しい単体テストを書いていますLog::Log4perl
:
モジュールはを呼び出しますINFO( "important message" );
。INFO
特定の状況で呼び出されるテストコードから検証するために、これをモックしたいと思います。
テストモジュールを実行すると、モジュールからの呼び出しがキャプチャされませんINFO
。これらの呼び出しをモックする正しい方法は何INFO
ですか?
完全な例を次に示します。
Mut.pm
Mut.t
perl - どのスクリプトがモジュールを初期化しましたか?
Perlでは、どの.plスクリプトがモジュールのこのインスタンスを初期化したかを知る方法はありますか?
Log4perl
具体的には、オブジェクトを持つモジュールを呼び出すスクリプトの名前を取得したいと思います。そうすれば、モジュール内でどの.logファイルに書き込みたいかがわかります。
私はこれを間違っていますか?$logger
.plスクリプトでを定義した場合$logger
、モジュール内の呼び出しは、呼び出し元のスクリプトと同じ.logファイルに書き込みますか?
私はまだサンプルコードを持っていませんが、を読んでいLog4perl
ます。基本的にcaller.log
、呼び出し元のスクリプトのファイルアペンダーであるファイルにアペンダーを設定した場合caller.pl
、カスタムインポートされたモジュールで定義されたログも書き込みますcaller.log
(暗黙的に、可能であれば-明らかに私はできます)モジュールインスタンスを初期化するときに、ログ名の名前を渡すだけです)。
これは、モジュールが書き込むファイルアペンダーを指定する引数を渡さなくても可能ですか?1つのインスタンスLog4perl
だけを使用しませんか?$logger
また、私が道を外れているかどうか、また別のアプローチがある場合は検討する必要があるかどうかを知らせてください。
ありがとうございました
編集:申し訳ありませんが、これを投稿した後、関連リンクを確認しましたが、検索の文言が正しくなかったと思います。これはかなり良い解決策のようです:Perlモジュールのセルフロギング(Mooseなし)
他に何かアイデアがあれば教えてください。
編集2:最終的にテストし、私が望んでいたように動作させるようにしました-それを実現するよりもはるかに簡単でした!
これが私の設定です。
Module.pm
caller.pl
perl - log4perl はどのようにして STDERR とファイルに同時に書き込むことができますか?
2 つのアペンダーをセットアップしようとしましたが、STDERR にのみ書き込むようです。
perl - Perl のモジュール間で Log4Perl を使用するにはどうすればよいですか?
ロギング用のモジュールで Log4Perl を使用する予定です。
私のコード構造は次のようになります
いくつかのパラメーターを検証する Start.PL があります。相互にリンクされたいくつかのモジュール (PM) ファイルがあります (これらの PL ファイルと PM ファイルで使用されます)。
ログオブジェクトを作成するメソッド InitiateLogger() がある Logger.PM があります
Logger::InitiateLogger();
Start.pl でこのメソッドを呼び出します
ここに私の質問があります
- モジュール間で同じ $log を使用するにはどうすればよいですか (PM ファイル)
- これには同じパッケージ名を使用する必要がありますか?
誰かが私にこれらの点を明確にするといいでしょう。