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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use hashers::fx_hash::FxHasher; use log::{Log, Record, LevelFilter, Metadata, SetLoggerError}; use std::collections::HashSet; use std::hash::BuildHasherDefault; pub struct DogLog { allowed_packages : HashSet<String, BuildHasherDefault<FxHasher>>, } fn prefix(text : &str, pos : usize) -> &str { &text[..pos] } impl DogLog { pub fn new() -> DogLog { let mut allowed_packages = HashSet::with_hasher(BuildHasherDefault::<FxHasher>::default()); allowed_packages.insert(String::from("keeshond")); DogLog { allowed_packages } } pub fn add_package_filter(&mut self, package_name : String) { self.allowed_packages.insert(package_name); } pub fn init(logger : DogLog, max_level : LevelFilter) -> Result<(), SetLoggerError> { let result = log::set_boxed_logger(Box::new(logger)); if result.is_ok() { log::set_max_level(max_level); } result } } impl Log for DogLog { fn enabled(&self, metadata: &Metadata) -> bool { let mut target : &str = &metadata.target(); if let Some(namespacer) = metadata.target().find(':') { target = prefix(metadata.target(), namespacer); } self.allowed_packages.contains(&String::from(target)) } fn log(&self, record : &Record) { if self.enabled(record.metadata()) { println!("[ {:5} {} ] {}", record.level(), record.target(), record.args()); } } fn flush(&self) { } }