nullnet_liblogging/
syslog_logger.rs

1use syslog::{BasicLogger, Facility, Formatter3164};
2
3/// Possible syslog endpoints
4pub enum SyslogEndpoint {
5    /// Use the local syslog server
6    Local,
7    /// Use a remote syslog server
8    Remote(String),
9}
10
11pub(crate) struct SyslogLogger {
12    logger: BasicLogger,
13}
14
15impl SyslogLogger {
16    pub(crate) fn new(syslog_endpoint: SyslogEndpoint, process_name: &str) -> Self {
17        let formatter = Formatter3164 {
18            facility: Facility::LOG_USER,
19            hostname: None,
20            process: process_name.to_string(),
21            pid: std::process::id(),
22        };
23
24        let logger = BasicLogger::new(
25            match syslog_endpoint {
26                SyslogEndpoint::Local => syslog::unix(formatter),
27                SyslogEndpoint::Remote(server) => syslog::tcp(formatter, server),
28            }
29            .expect("could not connect to syslog server"),
30        );
31
32        Self { logger }
33    }
34}
35
36impl log::Log for SyslogLogger {
37    fn enabled(&self, metadata: &log::Metadata) -> bool {
38        self.logger.enabled(metadata)
39    }
40
41    fn log(&self, record: &log::Record) {
42        self.logger.log(record);
43    }
44
45    fn flush(&self) {
46        self.logger.flush();
47    }
48}