signstar_common/
logging.rs

1//! Logging utilities.
2
3use log::{LevelFilter, Log};
4use simplelog::{ColorChoice, TermLogger, TerminalMode};
5use systemd_journal_logger::{JournalLog, connected_to_journal};
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/// # Errors
22///
23/// An error is returned if a logger has already been set.
24pub fn setup_logging(max_level: impl Into<LevelFilter>) -> Result<(), Error> {
25    if connected_to_journal()
26        && let Ok(log) = JournalLog::new().map(|log| {
27            Box::new(log.with_extra_fields(vec![("VERSION", env!("CARGO_PKG_VERSION"))]))
28                as Box<dyn Log>
29        })
30    {
31        log::set_boxed_logger(log)?;
32        log::set_max_level(max_level.into());
33        return Ok(());
34    }
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    Ok(())
43}