Преглед на файлове

Allow to log only on specific log targets

Aloïs Micard преди 4 години
родител
ревизия
f02c4013a3
променени са 5 файла, в които са добавени 44 реда и са изтрити 17 реда
  1. 1 5
      README.md
  2. 1 5
      examples/init.rs
  3. 2 6
      examples/init_with_level.rs
  4. 7 0
      examples/init_with_level_and_targets.rs
  5. 33 1
      src/lib.rs

+ 1 - 5
README.md

@@ -12,14 +12,10 @@ Usage
 -----
 
 ```rust
-#[macro_use]
-extern crate log;
-extern crate simple_logger;
-
 fn main() {
     simple_logger::init().unwrap();
 
-    warn!("This is an example message.");
+    log::warn!("This is an example message.");
 }
 ```
 

+ 1 - 5
examples/init.rs

@@ -1,9 +1,5 @@
-#[macro_use]
-extern crate log;
-extern crate simple_logger;
-
 fn main() {
     simple_logger::init().unwrap();
 
-    warn!("This is an example message.");
+    log::warn!("This is an example message.");
 }

+ 2 - 6
examples/init_with_level.rs

@@ -1,12 +1,8 @@
-#[macro_use]
-extern crate log;
-extern crate simple_logger;
-
 use log::Level;
 
 fn main() {
     simple_logger::init_with_level(Level::Warn).unwrap();
 
-    warn!("This will be logged.");
-    info!("This will NOT be logged.");
+    log::warn!("This will be logged.");
+    log::info!("This will NOT be logged.");
 }

+ 7 - 0
examples/init_with_level_and_targets.rs

@@ -0,0 +1,7 @@
+use log::Level;
+
+fn main() {
+    simple_logger::init_with_level_and_targets(Level::Info, &["wrong_target"]).unwrap();
+
+    log::info!("This will NOT be logged. (Wrong target)");
+}

+ 33 - 1
src/lib.rs

@@ -8,11 +8,19 @@ use log::{Level, Log, Metadata, Record, SetLoggerError};
 
 struct SimpleLogger {
     level: Level,
+    /// List of whitelisted log targets
+    /// if empty everything will be logged
+    whitelisted_targets: Vec<String>,
 }
 
 impl Log for SimpleLogger {
     fn enabled(&self, metadata: &Metadata) -> bool {
         metadata.level() <= self.level
+            && (self.whitelisted_targets.is_empty()
+                || self
+                    .whitelisted_targets
+                    .iter()
+                    .any(|t| t == metadata.target()))
     }
 
     fn log(&self, record: &Record) {
@@ -100,7 +108,31 @@ pub fn init_with_level(level: Level) -> Result<(), SetLoggerError> {
     #[cfg(all(windows, feature = "colored"))]
     set_up_color_terminal();
 
-    let logger = SimpleLogger { level };
+    let logger = SimpleLogger {
+        level,
+        whitelisted_targets: vec![],
+    };
+    log::set_boxed_logger(Box::new(logger))?;
+    log::set_max_level(level.to_level_filter());
+    Ok(())
+}
+
+/// Initializes the global logger with a SimpleLogger instance with
+/// `max_log_level` set to a specific log level as well as specific log targets.
+///
+/// ```
+/// simple_logger::init_with_level_and_targets(log::Level::Info, &["wrong_target"]).unwrap();
+///
+/// log::info!("This will NOT be logged. (Wrong target)");
+/// ```
+pub fn init_with_level_and_targets(level: Level, targets: &[&str]) -> Result<(), SetLoggerError> {
+    #[cfg(all(windows, feature = "colored"))]
+    set_up_color_terminal();
+
+    let logger = SimpleLogger {
+        level,
+        whitelisted_targets: targets.iter().map(|s| s.to_string()).collect(),
+    };
     log::set_boxed_logger(Box::new(logger))?;
     log::set_max_level(level.to_level_filter());
     Ok(())