use log::{LevelFilter, SetLoggerError, set_max_level};
use simplelog::{ColorChoice, TermLogger, TerminalMode};
use systemd_journal_logger::{JournalLog, connected_to_journal};
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("The process is not connected to the system journal")]
JournalNotConnected,
#[error("Journal initialization error: {0}")]
Journal(std::io::Error),
#[error("Logger initialization error: {0}")]
Logger(#[from] SetLoggerError),
}
pub fn setup_terminal_logging(max_level: impl Into<LevelFilter>) -> Result<(), crate::Error> {
TermLogger::init(
max_level.into(),
Default::default(),
TerminalMode::Stderr,
ColorChoice::Auto,
)
.map_err(|error| Error::Logger(error).into())
}
pub fn setup_systemd_journal_logging(
max_level: impl Into<LevelFilter>,
) -> Result<(), crate::Error> {
JournalLog::new()
.map_err(Error::Journal)?
.with_extra_fields(vec![("VERSION", env!("CARGO_PKG_VERSION"))])
.install()
.map_err(Error::Logger)?;
set_max_level(max_level.into());
Ok(())
}
pub fn setup_systemd_journal_logging_when_connected(
max_level: impl Into<LevelFilter>,
) -> Result<(), crate::Error> {
if !connected_to_journal() {
return Err(Error::JournalNotConnected.into());
}
JournalLog::new()
.map_err(Error::Journal)?
.with_extra_fields(vec![("VERSION", env!("CARGO_PKG_VERSION"))])
.install()
.map_err(Error::Logger)?;
set_max_level(max_level.into());
Ok(())
}