broxus_util/
log4rs.rs

1pub fn init_logger(initial_value: &serde_yaml::Value) -> Result<log4rs::Handle, LoggerError> {
2    let handle = log4rs::config::init_config(parse_logger_config(initial_value.clone())?)?;
3    Ok(handle)
4}
5
6pub fn parse_logger_config(value: serde_yaml::Value) -> Result<log4rs::Config, LoggerError> {
7    let config = serde_yaml::from_value::<log4rs::config::RawConfig>(value)?;
8
9    let (appenders, errors) = config.appenders_lossy(&log4rs::config::Deserializers::default());
10    if !errors.is_empty() {
11        return Err(LoggerError::InvalidAppenders(format!("{errors:#?}")));
12    }
13
14    log4rs::Config::builder()
15        .appenders(appenders)
16        .loggers(config.loggers())
17        .build(config.root())
18        .map_err(LoggerError::BuildError)
19}
20
21#[derive(thiserror::Error, Debug)]
22pub enum LoggerError {
23    #[error("bad config")]
24    InvalidConfig(#[from] serde_yaml::Error),
25    #[error("invalid appenders: {0}")]
26    InvalidAppenders(String),
27    #[error("failed to build logger")]
28    BuildError(#[from] log4rs::config::runtime::ConfigErrors),
29    #[error("failed to set logger")]
30    InitializationError(#[from] log::SetLoggerError),
31}