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}