我正在开发一个在主程序中使用AnyEvent Log的项目以及几个相关的模块/包。我目前让每个模块都写入它自己的上下文,并且所有上下文都作为从属添加到主程序上下文中。这个项目是一个更大的项目的一部分,除了写出本地日志文件之外,还有一些我希望发送给远程程序的消息,然后负责向用户显示消息。
问题是,为了发送到远程程序,我必须有一条只能从主程序获得的信息,所以在包级别实现一个方法是不可取的发送消息。我需要的信息或多或少是一个事务ID,而日志消息是来自特定事务的有趣事件。
主程序有2个上下文(主要,次要)。我感兴趣的消息将来自辅助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非常棒,所以没什么可惊喜的,但是任何有用的东西都会受到高度赞赏。