【问题标题】:rust - load environment variables into log4rs yml filerust - 将环境变量加载到 log4rs yml 文件中
【发布时间】:2020-07-14 04:34:55
【问题描述】:

是否可以将环境变量加载到 log4rs yml 配置文件中?

我有一个简单的 rust 应用程序,它使用 log4rs 进行日志记录。我从位于项目根目录中的 yml 文件加载日志配置。

现在我需要从环境变量中获取文件附加程序路径。在 spring/java 中,我们可以在 yml 文件中使用 ${ABC} 表示法来做到这一点。

我可以使用 rust/log4rs 中的类似方法吗?

【问题讨论】:

    标签: logging rust yaml


    【解决方案1】:

    类似于@lbolla 的建议,您可以将配置文件加载到 YAML 文本字符串中,然后使用serde_yaml::from_str(&str) 对其进行反序列化。然后,你可以使用我下面写的函数在文中展开${}格式的环境变量。最后,您可以将展开的文本写入文件并使用该文件来初始化您的记录器。

    use std::env;
    use regex::Regex;
    use regex::Captures;
    use std::borrow::Cow;
    
    fn expand_var(raw_config: &str) -> Cow<str> {
    
        let re = Regex::new(r"\$\{([a-zA-Z_][0-9a-zA-Z_]*)\}").unwrap();
        re.replace_all(&raw_config, |caps: &Captures| {
            match env::var(&caps[1]) {
                Ok(val) => val,
                Err(_) => (&caps[0]).to_string(),
            }
        })
    }
    

    Rust Playground

    【讨论】:

      【解决方案2】:

      log4rs 使用 serde-yaml 解析 YAML 文件:https://docs.rs/log4rs/0.12.0/src/log4rs/priv_file.rs.html#168

      所以默认情况下它不会对环境变量进行任何插值。

      您要么必须自己解析和构建 log4rs Config 对象,要么例如在加载之前使用正则表达式预解析 yaml 文件。前段时间我为 Python 写了一个类似的库:https://pypi.org/project/yamlenv/

      【讨论】:

        猜你喜欢
        • 2018-03-29
        • 2023-03-27
        • 2018-07-29
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 2018-11-03
        • 2023-03-05
        相关资源
        最近更新 更多