【问题标题】:Write logs to more destinations with tracing crate使用跟踪箱将日志写入更多目的地
【发布时间】:2021-02-11 02:38:44
【问题描述】:

我正在尝试使用tracing crate 实现一些集中式日志记录。 我可以使用 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);
  }
}

如果日志配置仅包含 filegraylog 定义之一,它可以工作,但如果我定义了两个应用程序在启动时崩溃。

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

【问题讨论】:

    标签: rust trace


    【解决方案1】:

    最近我发现在编写layers 时可以在with 中使用Option<Layer>

        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);
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2016-11-21
    相关资源
    最近更新 更多