如果满足某些要求,则将AnyEvent :: Log消息转发给回调

时间:2014-07-28 21:28:59

标签: perl logging daemon anyevent

我正在开发一个在主程序中使用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非常棒,所以没什么可惊喜的,但是任何有用的东西都会受到高度赞赏。

0 个答案:

没有答案