メイン プログラムで AnyEvent Log を使用し、いくつかの依存モジュール/パッケージを使用するプロジェクトに取り組んでいます。現在、各モジュールが独自のコンテキストに書き込みを行っており、すべてのコンテキストがメイン プログラムのコンテキストにスレーブとして追加されています。このプロジェクトは、はるかに大きなプロジェクトの一部であり、ローカル ログ ファイルを書き出すことに加えて、特定のメッセージをリモート プログラムに送信して、ユーザーにメッセージを表示する責任があります。
問題は、リモート プログラムに送信するために、メイン プログラムからのみ入手できる情報が必要なため、メッセージを送信するためにパッケージ レベルでメソッドを実装するだけでは費用がかからないことです。必要な情報は多かれ少なかれトランザクション ID であり、ログ メッセージは特定のトランザクションからの興味深いイベントです。
メイン プログラムには 2 つのコンテキスト ( main 、 secondary ) があります。私が興味を持っているメッセージは、セカンダリ ctx またはパッケージ/モジュール コンテキストのいずれかから送信されます。情報のみを送信することに関心があります-重要レベルのメッセージをユーザーに送信しますが、txID がメインプログラムに存在する場合のみです。展開が実行されているかどうかに関係なく、常にメッセージがローカル ログ ファイルに書き込まれるようにしたいと考えています。モジュールは特定のことを行うように割り当てられており、手元のタスクに関連付けられた ID があるという事実さえ認識してはならないため、これをモジュールではなくメイン プログラムでセットアップするものにしたいと思います。
以下は、メイン プログラムのログ構成固有のコードの簡単な内訳です。
# Immediately after Proc::Daemon::Init
my $logger = AnyEvent::Log::ctx "desman";
# configure is done before daemonization to allow for --nodaemon
sub configure {
my ( $level, $file ) = @_;
$AnyEvent::Log::FILTER->level($level);
$AnyEvent::Log::LOG->log_to_file($file);
}
sub log_event {
... logic to send messages as tx event ...
}
sub worker_init {
threads->create(sub {
$logger->attach( my $worklog = AnyEvent::Log::ctx "worker" );
... more stuff for worker specifics ...
});
}
理想的には、log_cb と fmt_cb のいずれかまたは両方を使用して、log_event サブルーチンを使用してリモート プログラムへのメッセージのフォーマットと送信を処理できます。私はいくつかの異なることを試しましたが、今のところ行き詰まっています。
# doesn't seem to do anything
$logger->fmt_cb( sub { ... } );
$logger->log_cb( sub { ... } );
# broke everything
$AnyEvent::Log::COLLECT->attach( my $evtlog = new AnyEvent::Log::Ctx
fmt_cb => \&event_formatter,
log_cb => \&log_event
);
$evtlog->levels('crit','warning','notice','info');
ドキュメントにあるものよりも多くの例を探していますが、まだあまり見つかりません。AE::log はそのままでもかなり素晴らしいので、それほど驚くことではありませんが、何かお役に立てれば幸いです。