1

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

4

0 回答 0