log4rs_syslog_net/
plain.rs

1use crate::consts::{level_to_severity, Facility};
2use log::Record;
3use log4rs::encode::writer::simple::SimpleWriter;
4use log4rs::encode::Encode;
5use std::error::Error;
6use std::sync::Arc;
7
8#[derive(Clone, Debug)]
9pub struct Format(pub Arc<dyn Encode>);
10
11impl Default for Format {
12    fn default() -> Self {
13        Format(Arc::new(log4rs::encode::pattern::PatternEncoder::default()))
14    }
15}
16
17impl Format {
18    pub fn encoder<E: Encode>(mut self, encoder: E) -> Self {
19        self.0 = Arc::new(encoder) as Arc<dyn Encode + 'static>;
20        self
21    }
22}
23
24impl log4rs::encode::Encode for Format {
25    fn encode(
26        &self,
27        w: &mut dyn log4rs::encode::Write,
28        record: &Record<'_>,
29    ) -> Result<(), Box<dyn Error + Sync + Send>> {
30        let mut buf: Vec<u8> = Vec::new();
31        self.0.encode(&mut SimpleWriter(&mut buf), record)?;
32        let msg = String::from_utf8_lossy(&buf);
33
34        let priority = Facility::USER as u8 | level_to_severity(record.level());
35        let msg = format!("<{}> {}\n", priority, msg);
36        w.write_all(msg.as_bytes())?;
37        Ok(())
38    }
39}