如何根据env变量配置tracing_subscriber输出格式(json或纯文本)?

问题描述 投票:0回答:1

我正在尝试根据变量设置跟踪格式,我想要类似的东西:

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

但是看起来很乱

rust trace rust-tokio rust-axum rust-tracing
1个回答
0
投票

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();
© www.soinside.com 2019 - 2024. All rights reserved.