use log::{Level, Metadata, Record}; use std::sync::{Arc, Mutex}; pub struct LogtailLogger { ing: Arc>, threshold: Level, } #[derive(serde::Serialize)] struct LogData<'a> { level: &'a str, target: &'a str, module_path: &'a str, file: &'a str, line: u32, message: String, } impl log::Log for LogtailLogger { fn enabled(&self, metadata: &Metadata) -> bool { metadata.level() <= self.threshold } fn log(&self, record: &Record) { if self.enabled(record.metadata()) { let ld = LogData { level: record.level().as_str(), target: record.target(), module_path: record.module_path().unwrap_or("???"), file: record.file().unwrap_or("???"), line: record.line().unwrap_or(0), message: format!("{}", record.args()), }; if let Ok(val) = serde_json::to_value(&ld) { if let Ok(mut ing) = self.ing.lock() { if let Err(why) = ing.send(val) { eprintln!("logtail_facade::jog::LogtailLogger::log: can't send json value to buffer: {}", why); } } } } } fn flush(&self) {} }