You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

65 lines
2.1 KiB

//! Simple logging system, to log to both the IRC channel and stdout.
use log::{Record, LevelFilter, Metadata};
use futures::sync::mpsc::UnboundedSender;
use crate::comm::ControlBotCommand;
pub struct Logger {
chan_loglevel: LevelFilter,
stdout_loglevel: LevelFilter,
ignore_other_libraries: bool,
sender: UnboundedSender<ControlBotCommand>,
}
impl Logger {
pub fn new(cll: LevelFilter, sll: LevelFilter, ign: bool, sender: UnboundedSender<ControlBotCommand>) -> Self {
Self {
chan_loglevel: cll,
stdout_loglevel: sll,
ignore_other_libraries: ign,
sender
}
}
pub fn register(self) {
let level = self.chan_loglevel.max(self.stdout_loglevel);
let logger = Box::new(self);
log::set_boxed_logger(logger)
.unwrap();
log::set_max_level(level);
}
}
impl log::Log for Logger {
fn enabled(&self, metadata: &Metadata) -> bool {
if self.ignore_other_libraries
&& !metadata.target().starts_with("sms_irc")
&& !metadata.target().starts_with("whatsappweb_eta") {
return false;
}
let lvl = metadata.level();
lvl <= self.chan_loglevel || lvl <= self.stdout_loglevel
}
fn log(&self, rec: &Record) {
use log::Level::*;
if self.ignore_other_libraries
&& !rec.target().starts_with("sms_irc")
&& !rec.target().starts_with("whatsappweb_eta") {
return;
}
if rec.level() <= self.stdout_loglevel {
println!("[{}] {} -- {}", rec.target(), rec.level(), rec.args());
}
if rec.level() <= self.chan_loglevel {
let colour = match rec.level() {
Error => "04",
Warn => "07",
Info => "09",
Debug => "10",
Trace => "11"
};
self.sender.unbounded_send(
ControlBotCommand::Log(format!("[\x0302{}\x0f] \x02\x03{}{}\x0f -- {}", rec.target(), colour, rec.level(), rec.args())))
.unwrap();
}
}
fn flush(&self) {
}
}