rebterlai/crates/logtail-facade/src/log.rs

47 lines
1.3 KiB
Rust

use log::{Level, Metadata, Record};
use std::sync::{Arc, Mutex};
pub struct LogtailLogger {
ing: Arc<Mutex<logtail_poster::Ingress>>,
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) {}
}