Rust 使用跟踪板条箱将日志写入更多目标

Rust 使用跟踪板条箱将日志写入更多目标,rust,trace,Rust,Trace,我正在尝试使用跟踪板条箱实现一些集中式日志记录。 我可以使用板条箱tracing\u appender写入滚动文件,或使用以下代码写入Graylog应用程序: let mut guards = Vec::new(); if let Some(log) = config.logs { if let Some(file) = log.file { let file_appender = tracing_appender::rolling::hourly(file.directory, f

我正在尝试使用
跟踪
板条箱实现一些集中式日志记录。
我可以使用板条箱
tracing\u appender
写入滚动文件,或使用以下代码写入
Graylog
应用程序:

let mut guards = Vec::new();
if let Some(log) = config.logs {
  if let Some(file) = log.file {
    let file_appender = tracing_appender::rolling::hourly(file.directory, file.filename);
    let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
    guards.push(guard);
    let file_logger = tracing_subscriber::fmt()
      .with_writer(non_blocking)
      .init();
  }

  if let Some(graylog) = log.graylog {
    let address: SocketAddr = graylog.host.parse().expect("Unable to parse graylog host address");
    let bg_task = Logger::builder()
      .additional_field("module_id", graylog.module_id)
      .init_tcp(address)
      .unwrap();

    tokio::spawn(bg_task);
  }
}
如果日志配置只包含
file
graylog
定义中的一个,那么它可以工作,但是如果我定义了这两个,那么应用程序在启动时崩溃

我认为存在冲突,因为两者都试图设置默认收集器。
有什么方法可以同时定义接受每个跨度和事件吗?

最近我发现,在撰写以下内容时,您可以在
中使用

让mut-guards=Vec::new();
如果让一些(log)=config.logs{
let file_log=如果let Some(file)=log.file{
让file_appender=tracing_appender::rolling::hourly(file.directory,file.filename);
let(non_blocking,guard)=跟踪_appender::non_blocking(file_appender);
防护装置。推(防护装置);
一些(fmt::Layer::new(),带有_writer(非_阻塞))
}否则{
没有一个
};
let grey_log=如果let Some(graylog)=log.graylog{
let地址:SocketAddr=graylog
主办
.parse()
.expect(“无法解析graylog主机地址”);
let(层,任务)=跟踪\u gelf::Logger::builder()。连接\u tcp(地址)?;
东京:产卵(任务);
部分(层)
}否则{
没有一个
};
让mut subscriber=tracing_subscriber::registry()
.with(EnvFilter::…)
.with(文件\日志)
.带有(灰色)日志;
}

@TheGr8_Nik,很高兴我为你节省了一些时间。因为我知道在没有帮助的情况下这有多难:)好吧,它是有文档记录的,只是不是手写文本-
选项
也实现了
:啊哈,就是这样,谢谢@Cerberus!