Skip to main content

signstar_common/
logging.rs

1//! Logging utilities.
2
3use log::{LevelFilter, Log};
4use simplelog::{ColorChoice, TermLogger, TerminalMode};
5use systemd_journal_logger::JournalLog;
6
7/// Logging setup error.
8#[derive(Debug, thiserror::Error)]
9pub enum Error {
10    /// Journal initialization error.
11    #[error("Journal initialization error: {0}")]
12    Journal(std::io::Error),
13
14    /// Logger initialization error.
15    #[error("Logger initialization error: {0}")]
16    Logger(#[from] log::SetLoggerError),
17}
18
19/// Sets up logging facilities.
20///
21/// This function first tries to connect to journald socket for logging.
22/// Only when that fails a simple logger is used.
23///
24/// # Errors
25///
26/// An error is returned if a logger has already been set.
27pub fn setup_logging(max_level: impl Into<LevelFilter>) -> Result<(), Error> {
28    if let Ok(log) = JournalLog::new().map(|log| {
29        Box::new(log.with_extra_fields(vec![("VERSION", env!("CARGO_PKG_VERSION"))]))
30            as Box<dyn Log>
31    }) {
32        log::set_boxed_logger(log)?;
33        log::set_max_level(max_level.into());
34    } else {
35        TermLogger::init(
36            max_level.into(),
37            Default::default(),
38            // simplelog needs to be explicitly instructed to always use stderr
39            TerminalMode::Stderr,
40            ColorChoice::Auto,
41        )?;
42    }
43    Ok(())
44}