我正在开发一个在主程序中使用 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 非常棒,但任何可以提供帮助的东西都将不胜感激。