diff --git a/Cargo.toml b/Cargo.toml index 1e33706..54e0694 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.7.2" +version = "1.7.3" edition = "2021" authors = ["baoyachi "] description = "A simple log. It's really simple use" diff --git a/examples/filter_module.rs b/examples/filter_module.rs new file mode 100644 index 0000000..85ce05c --- /dev/null +++ b/examples/filter_module.rs @@ -0,0 +1,73 @@ +//! `cargo run --example console` +//! +//! With OutPut +//! ```bash +//! 16:57:13.619320000 [DEBUG] :test console debug +//! 16:57:13.619481000 [INFO] :test console info +//! 16:57:13.619489000 [WARN] :test console warn +//! 16:57:13.619495000 [ERROR] :test console error +//! 16:57:13.619501000 [INFO] :init app +//! 16:57:13.619507000 [INFO] :init launch +//! 16:57:13.619515000 [DEBUG] :parser log + +//! ``` + +#[macro_use] +extern crate simple_log; + +use simple_log::LogConfig; + +fn main() -> Result<(), String> { + let config = r#" + level = "debug" + out_kind = "console" + time_format = "%H:%M:%S.%f" + filter_module = ["filter_module::app::ctrl","filter_module::app::launch::conf"] + "#; + let conf: LogConfig = toml::from_str(config).unwrap(); + + simple_log::new(conf).unwrap(); //init log + + debug!("test console debug"); + info!("test console info"); + warn!("test console warn"); + error!("test console error"); + + app::init_app(); + app::launch::init_launch(); + app::launch::conf::err_conf(); // this log filter + app::launch::parser::err_parser(); + app::ctrl::init_ctrl(); // this log filter + + Ok(()) +} + +pub(crate) mod app { + pub fn init_app() { + info!("init app") + } + + pub mod launch { + pub fn init_launch() { + info!("init launch") + } + + pub mod conf { + pub fn err_conf() { + error!("conf log") + } + } + + pub mod parser { + pub fn err_parser() { + debug!("parser log") + } + } + } + + pub mod ctrl { + pub fn init_ctrl() { + info!("init ctrl") + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 51c1d53..56bfdf3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -92,12 +92,14 @@ mod out_kind; use crate::out_kind::OutKind; use convert_case::{Case, Casing}; +use log::LevelFilter; use log4rs::append::console::ConsoleAppender; use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller; use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger; use log4rs::append::rolling_file::policy::compound::CompoundPolicy; use log4rs::append::rolling_file::RollingFileAppender; -use log4rs::config::{Appender, Config, Root}; +use log4rs::config::runtime::LoggerBuilder; +use log4rs::config::{Appender, Config, Logger, Root}; use log4rs::encode::pattern::PatternEncoder; use once_cell::sync::OnceCell; use out_kind::deserialize_out_kind; @@ -249,13 +251,19 @@ pub fn get_log_conf() -> SimpleResult { #[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct LogConfig { + #[serde(default)] pub path: Option, pub level: String, + #[serde(default)] pub size: u64, #[serde(deserialize_with = "deserialize_out_kind", default)] pub out_kind: Vec, + #[serde(default)] pub roll_count: u32, + #[serde(default)] pub time_format: Option, + #[serde(default)] + pub filter_module: Vec, } impl LogConfig { @@ -500,6 +508,7 @@ pub fn console>(level: S) -> SimpleResult<()> { out_kind: vec![OutKind::Console], roll_count: 0, time_format: Some(DEFAULT_DATE_TIME_FORMAT.to_string()), + filter_module: vec![], }; init_log_conf(config)?; Ok(()) @@ -535,6 +544,7 @@ pub fn file>(path: S, level: S, size: u64, roll_count: u32) -> S out_kind: vec![OutKind::File], roll_count, time_format: Some(DEFAULT_DATE_TIME_FORMAT.to_string()), + filter_module: vec![], }; init_log_conf(config)?; Ok(()) @@ -563,6 +573,14 @@ fn build_config(log: &LogConfig) -> SimpleResult { } } + for module_name in &log.filter_module { + config_builder = config_builder.logger(LoggerBuilder::build( + Logger::builder(), + module_name, + LevelFilter::Off, + )); + } + let config = config_builder .build(root_builder.build(log_level::form_log_level(&log.level))) .map_err(|e| e.to_string())?;