如何将字符串转换为与tracing_subscriber一起使用的级别?

miq*_*qrc 0 rust rust-tracing

我想使用字符串设置跟踪级别(因为我从环境变量获取级别)。

let env_log_level = std::env::var("LOG_LEVEL").unwrap();

tracing_subscriber::fmt()
    .with_max_level(tracing::Level::DEBUG) // somehow use env_log_level here
    .with_target(false)
    .init();
Run Code Online (Sandbox Code Playgroud)

我想这应该是一种将字符串解析为 Level 对象的方法,但我不知道如何实现。

kmd*_*eko 6

Level实现FromStr接受“错误”、“警告”、“信息”、“调试”或“跟踪”(不区分大小写)。所以你可以像这样使用它:

use std::str::FromStr;

let env_log_level = std::env::var("LOG_LEVEL").unwrap();

tracing_subscriber::fmt()
    .with_max_level(Level::from_str(&env_log_level).unwrap())
    .with_target(false)
    .init();
Run Code Online (Sandbox Code Playgroud)

注意:我使用的::from_str()不是.parse()因为.with_max_level()是通用的并且需要类型注释。


正如 @Finomnis 所建议的,一个功能更丰富的解决方案将是利用,EnvFilter因为它允许配置全局日志级别等(请参阅文档)。

tracing_subscriber::fmt()
    .with_env_filter(EnvFilter::from_env("LOG_LEVEL"))
    .with_target(false)
    .init();
Run Code Online (Sandbox Code Playgroud)