#![crate_type = "lib"] #![crate_name = "lolog"] extern crate log; use std::io; use log::{LogRecord, LogLevel, LogMetadata, SetLoggerError}; use std::sync::{Arc, Mutex}; pub struct Logger { max_level: LogLevel, output: Arc>, } impl log::Log for Logger { fn enabled(&self, metadata: &LogMetadata) -> bool { metadata.level() <= self.max_level } fn log(&self, record: &LogRecord) { if self.enabled(record.metadata()) { let o = self.output.clone(); let mut f = o.lock().unwrap(); let err = f.write_all( format!("{} - {}", record.level(), record.args()).as_str().as_bytes()); match err { Ok(_) => {}, Err(e) => { panic!(e) }, // FIXME } } } } impl Logger { pub fn new( max_level: LogLevel, writer: &mut W, ) -> Logger { Logger{ max_level: max_level, output: Arc::new(Mutex::new(writer as &mut (io::Write + Send))), } } } pub fn init_logger(logger: &Logger) -> Result<(), SetLoggerError> { log::set_logger(|max_log_level| { max_log_level.set(logger.max_level.to_log_level_filter()); Box::new(logger) }) } /* pub fn init( max_level: LogLevel, writer: &'static mut W, ) -> Result<(), SetLoggerError> { log::set_logger(move |max_log_level| { let logger = Logger::new(max_level, writer); max_log_level.set(max_level.to_log_level_filter()); Box::new(logger) }) } pub fn init(max_level: LogLevel, writer: &'static mut W) -> Result<(), SetLoggerError> { let output = Arc::new(Mutex::new(writer as &mut (io::Write + Send))); let logger = Box::new(Logger{ max_level: max_level, output: output, }); log::set_logger(|max_log_level| { max_log_level.set(max_level.to_log_level_filter()); logger }) } */ #[cfg(test)] mod test { #[test] fn it_works() { } }