1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
use std::sync::RwLock; use std::env; use std::fs::OpenOptions; use std::io::Write; use log::{self, LogRecord, LogLevel, LogLevelFilter, LogMetadata, SetLoggerError}; use time; struct ScreenLogger; impl log::Log for ScreenLogger { fn enabled(&self, metadata: &LogMetadata) -> bool { metadata.level() <= LogLevel::Info } fn log(&self, record: &LogRecord) { if self.enabled(record.metadata()) { let line = format!("{} - {}", record.level(), record.args()); let mut logs = LOGS.write().unwrap(); logs.insert(0, line); logs.truncate(5); } let line = format!("{} {} {}:{}] {}\n", time::get_time().sec, record.level(), record.location().file().split("/").last().unwrap(), record.location().line(), record.args()); if let Ok(path) = env::var("LOGFILE") { let mut f = OpenOptions::new() .append(true) .create(true) .open(path) .unwrap(); f.write_all(line.as_bytes()).unwrap(); } } } pub fn init_screen_log() -> Result<(), SetLoggerError> { log::set_logger(|max_log_level| { max_log_level.set(LogLevelFilter::Debug); Box::new(ScreenLogger) }) } pub fn read_logs() -> Vec<String> { LOGS.read().unwrap().clone() } lazy_static! { static ref LOGS: RwLock<Vec<String>> = RwLock::new(vec![]); }