use crate::compression::Compression;
use crate::formatter::{default_formatter, Formatter};
use crate::logger::{Logger, TIMER};
use log::Level;
use std::cell::RefCell;
use std::fmt;
use std::io;
use std::time::Instant;
#[derive(Debug)]
pub enum LoggerError {
ConnectionFailure(String),
IoError(io::Error),
}
impl fmt::Display for LoggerError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
LoggerError::ConnectionFailure(e) => write!(f, "Actix Connection Failure {:?}", e),
LoggerError::IoError(e) => write!(f, "IoError {:?}", e),
}
}
}
impl From<io::Error> for LoggerError {
fn from(error: io::Error) -> Self {
LoggerError::IoError(error)
}
}
pub struct LoggerBuilder {
level: Level,
compression: Compression,
sink_url: String,
threshold: usize,
format: RefCell<Box<Formatter>>,
store_tmp_logs: bool,
}
impl Default for LoggerBuilder {
fn default() -> LoggerBuilder {
LoggerBuilder {
level: Level::Trace,
compression: Compression::Suggested,
sink_url: "http://127.0.0.1:9999/compressed_sink".to_string(),
threshold: 1_000_000usize,
format: RefCell::new(Box::new(default_formatter)),
store_tmp_logs: false,
}
}
}
impl LoggerBuilder {
pub fn set_level(mut self, level: Level) -> Self {
self.level = level;
self
}
pub fn set_compression_level(mut self, compression: Compression) -> Self {
self.compression = compression;
self
}
pub fn set_sink_url(mut self, url: &str) -> Self {
self.sink_url = url.to_string();
self
}
pub fn set_format(mut self, format: Box<Formatter>) -> Self {
self.format = RefCell::new(format);
self
}
pub fn set_buffer_size(mut self, buffer_size: usize) -> Self {
self.threshold = buffer_size;
self
}
pub fn enable_tmp_log_storage(mut self) -> Self {
self.store_tmp_logs = true;
self
}
pub fn build(&self) -> Result<Logger, LoggerError> {
debug_eprintln!("Building compressed logger");
let sink_url = self.sink_url.clone();
let formatter = self.format.replace(Box::new(default_formatter));
*TIMER.write().unwrap() = Instant::now();
Logger::with_level(
self.level,
self.compression,
self.threshold,
sink_url,
formatter,
self.store_tmp_logs,
)
}
}