【发布时间】:2020-07-14 04:34:55
【问题描述】:
是否可以将环境变量加载到 log4rs yml 配置文件中?
我有一个简单的 rust 应用程序,它使用 log4rs 进行日志记录。我从位于项目根目录中的 yml 文件加载日志配置。
现在我需要从环境变量中获取文件附加程序路径。在 spring/java 中,我们可以在 yml 文件中使用 ${ABC} 表示法来做到这一点。
我可以使用 rust/log4rs 中的类似方法吗?
【问题讨论】:
是否可以将环境变量加载到 log4rs yml 配置文件中?
我有一个简单的 rust 应用程序,它使用 log4rs 进行日志记录。我从位于项目根目录中的 yml 文件加载日志配置。
现在我需要从环境变量中获取文件附加程序路径。在 spring/java 中,我们可以在 yml 文件中使用 ${ABC} 表示法来做到这一点。
我可以使用 rust/log4rs 中的类似方法吗?
【问题讨论】:
类似于@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(),
}
})
}
【讨论】:
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/
【讨论】: