我正在try 使用tracing
和tracing-subscriber
构建日志(log)记录设置.然而,我发现tracing
生态系统非常抽象,很难处理.
我在试着创建订阅者-
但我无法使用现有的实现Registry
和FmtSubscriber
创建最终订阅者.
问题是,Registry
不允许添加env_filter
或顶级过滤器.而FmtSubscriber
不允许添加写入器层.我不清楚,当它们都实现Subscriber
特性时,为什么这两个都不可能.
use tracing::{instrument::WithSubscriber, metadata::LevelFilter, subscriber, Level, Subscriber};
use tracing_appender::{
non_blocking::WorkerGuard,
rolling::{RollingFileAppender, Rotation},
};
use tracing_subscriber::{
filter::filter_fn, fmt, layer::Filter, prelude::*, registry::LookupSpan, Registry,
};
fn main() {
// layer 1 is the file writer
let rolling_log = RollingFileAppender::new(Rotation::NEVER, "hey", "cool.og");
let (non_blocking, _) = tracing_appender::non_blocking(rolling_log);
let layer1 = fmt::Layer::default()
.with_writer(non_blocking)
.with_filter(LevelFilter::from(Level::INFO));
// layer 2 is the stdout writer
let (non_blocking, _) = tracing_appender::non_blocking(std::io::stdout());
let layer2 = fmt::Layer::default()
.with_writer(non_blocking)
.with_filter(LevelFilter::from(Level::ERROR));
let top_level_filter: String = "module_a=info,module_b=error".to_string();
// can't add env_filter/top level filter
Registry::default().with(layer1).with(layer2).init();
// can't add multiple writer layers
fmt().with_env_filter(top_level_filter).init();
}
总的来说,我发现很难理解跟踪中的各种组件是如何组合在一起的.任何解释它如何工作的博客或教程也会有所帮助.