我正在尝试根据变量设置跟踪格式,我想要类似的东西:
let tracing_layer = {
if env::var("LOG_FORMAT").is_ok_and(|format| format == "json") {
tracing_subscriber::fmt::layer().json();
} else {
tracing_subscriber::fmt::layer();
}
};
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "api_gateway=debug,axum=debug,tower_http=debug".into()))
.with(tracing_layer)
.init();
并得到:
the trait bound (): __tracing_subscriber_Layer<tracing_subscriber::layer::Layered<EnvFilter, Registry>> is not satisfied
the following other types implement trait __tracing_subscriber_Layer<S>:
DynFilterFn<S, F, R>
Box<(dyn __tracing_subscriber_Layer<S> + Send + Sync + 'static)>
Box<L>
FilterFn<F>
tracing::level_filters::LevelFilter
EnvFilter
Filtered<L, F, S>
Targets
and 6 others
我无法弄清楚
tracing_layer
的泛型类型应该是什么样子。我明白这是tracing_subscriber::fmt::Layer<S: tracing::Subscriber>
。也许,有一些更好的解决方案来设置输出格式。
我知道我可以这样做:
if env::var("LOG_FORMAT").is_ok_and(|log| log == "json") {
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "api_gateway=debug,axum=debug,tower_http=debug".into()))
.with(tracing_subscriber::fmt::layer().json())
.init();
} else {
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "api_gateway=debug,axum=debug,tower_http=debug".into()))
.with(tracing_subscriber::fmt::layer())
.init();
}
但是看起来很乱
Box<dyn Layer<S>>
意味着 Layer<S>
,所以:
let tracing_layer = {
if env::var("LOG_FORMAT").is_ok_and(|format| format == "json") {
Box::new(tracing_subscriber::fmt::layer().json()) as Box<dyn Layer<Registry>>
} else {
Box::new(tracing_subscriber::fmt::layer())
}
};
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "api_gateway=debug,axum=debug,tower_http=debug".into()))
.with(tracing_layer)
.init();