rust - 使用跟踪箱将日志写入更多目的地

标签 rust trace

我正在尝试使用 tracing 实现一些集中式日志记录箱。
我可以用 crate 写入滚动文件 tracing_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定义它有效,但如果我定义两个应用程序在启动时崩溃。
我认为存在冲突,因为两者都试图设置默认收集器。
有什么方法可以定义两者以接受每个跨度和事件?

最佳答案

最近我发现你可以使用 Option<Layer> with作曲时layers :

    let mut guards = Vec::new();
    if let Some(log) = config.logs {
        let file_log = 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);
            Some(fmt::Layer::new().with_writer(non_blocking))
        } else {
            None
        };

        let grey_log = if let Some(graylog) = log.graylog {
            let address: SocketAddr = graylog
                .host
                .parse()
                .expect("Unable to parse graylog host address");
            let (layer, task) = tracing_gelf::Logger::builder().connect_tcp(address)?;
            tokio::spawn(task);
            Some(layer)
        } else {
            None
        };

        let mut subscriber = tracing_subscriber::registry()
            .with(EnvFilter::...)
            .with(file_log)
            .with(grey_log);
    }

关于rust - 使用跟踪箱将日志写入更多目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66138104/

相关文章:

arrays - 从 Rust 中的函数返回未知大小的多维数组

rust - 追加到 for 循环内的字符串

methods - 为什么 Rust 禁止现有类型的实现?

intellij-idea - 在 Intellij 想法中跟踪快捷方式

rust - 如何在实现特征时明确指定生命周期?

rust - 为什么我不能使用 `ty` 宏匹配器来构造结构?

Android Debug Tracing问题

在二维数组中跟踪边界的算法

.net - 从本地站点登录到 Azure

c++ - 为什么 glDrawPixels 在这里不起作用?