gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:29:11 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com