Skip to main content

syslog_too/logger/
rfc5424.rs

1//! Defines the RFC 5424 logger struct and trait implementations.
2
3use super::{Logger, LoggerBackend};
4use crate::Formatter5424;
5use log::{Level, Log, Metadata, Record};
6use std::collections::BTreeMap;
7use std::io::Write;
8use std::sync::{Arc, Mutex};
9
10/// Logger struct for the RFC 5424 syslog protocol.
11pub struct Logger5424 {
12    logger: Arc<Mutex<Logger<LoggerBackend, Formatter5424>>>,
13}
14
15impl Logger5424 {
16    /// Create a new logger with the RFC5424 formatter.
17    pub fn new(logger: Logger<LoggerBackend, Formatter5424>) -> Self {
18        Self {
19            logger: Arc::new(Mutex::new(logger)),
20        }
21    }
22}
23
24impl Log for Logger5424 {
25    fn enabled(&self, metadata: &Metadata) -> bool {
26        metadata.level() <= log::max_level() && metadata.level() <= log::STATIC_MAX_LEVEL
27    }
28
29    fn log(&self, record: &Record) {
30        if self.enabled(record.metadata()) {
31            //FIXME: temporary patch to compile
32            let msg = format!("{}", record.args());
33            let btree: BTreeMap<String, BTreeMap<String, String>> = BTreeMap::new();
34            let mut logger = self.logger.lock().unwrap();
35            let _ = match record.level() {
36                Level::Error => logger.err((1, btree.clone(), msg)),
37                Level::Warn => logger.warning((1, btree.clone(), msg)),
38                Level::Info => logger.info((1, btree.clone(), msg)),
39                Level::Debug => logger.debug((1, btree.clone(), msg)),
40                Level::Trace => logger.debug((1, btree, msg)),
41            };
42        }
43    }
44
45    fn flush(&self) {
46        let _ = self.logger.lock().unwrap().backend.flush();
47    }
48}