log4rs_syslog_net/
plain.rs1use 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}