rust - загрузить переменные окружения в файл log4rs yml - PullRequest
1 голос
/ 14 июля 2020

Можно ли загрузить переменные среды в файл конфигурации log4rs yml?

У меня есть простое приложение rust, которое использует log4rs для ведения журнала. Я загружаю конфигурации журнала из файла yml, который находится в проекте root.

Теперь у меня есть требование получить путь к приложению файла из переменной среды. В spring / java мы можем сделать это с помощью нотации ${ABC} в файле yml.

Есть ли аналогичный подход в rust / log4rs, который я могу использовать.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Подобно тому, что предлагает @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

1 голос
/ 14 июля 2020

log4rs использует serde-yaml для анализа файлов YAML: https://docs.rs/log4rs/0.12.0/src/log4rs/priv_file.rs.html#168

Таким образом, по умолчанию он не выполняет никакой интерполяции переменных окружения.

You ' Мне придется либо разобрать и построить объект log4rs Config самостоятельно, либо, например, использовать регулярное выражение для предварительного анализа yaml-файла перед загрузкой. Я писал похожую библиотеку для Python несколько раз go: https://pypi.org/project/yamlenv/

...