structured_logger/
json.rs1use parking_lot::Mutex;
14use std::{cell::RefCell, collections::BTreeMap, io, io::Write};
15
16use crate::{log_failure, Key, Value, Writer};
17pub struct JSONWriter<W: Write + Sync + Send + 'static>(Mutex<RefCell<Box<W>>>);
19
20impl<W: Write + Sync + Send + 'static> JSONWriter<W> {
21 pub fn new(w: W) -> Self {
23 Self(Mutex::new(RefCell::new(Box::new(w))))
24 }
25}
26
27impl<W: Write + Sync + Send + 'static> Writer for JSONWriter<W> {
29 fn write_log(&self, value: &BTreeMap<Key, Value>) -> Result<(), io::Error> {
30 let mut buf = Vec::with_capacity(256);
31 serde_json::to_writer(&mut buf, value).map_err(io::Error::from)?;
32 buf.write_all(b"\n")?;
34
35 let w = self.0.lock();
36 if let Ok(mut w) = w.try_borrow_mut() {
37 w.as_mut().write_all(&buf)?;
38 } else {
39 log_failure("JSONWriter failed to write log: writer already borrowed");
41 }
42 Ok(())
43 }
44}
45
46pub fn new_writer<W: Write + Sync + Send + 'static>(w: W) -> Box<dyn Writer> {
48 Box::new(JSONWriter::new(w))
49}