diff --git a/crates/clash-verge-logging/src/lib.rs b/crates/clash-verge-logging/src/lib.rs index ee9bd3a5e..4c2d88843 100644 --- a/crates/clash-verge-logging/src/lib.rs +++ b/crates/clash-verge-logging/src/lib.rs @@ -97,23 +97,35 @@ pub fn write_sidecar_log( let _ = writer.write(now, &record); } -pub struct NoModuleFilter<'a>(pub Vec<&'a str>); +pub struct ModuleFilter<'a> { + block: Vec<&'a str>, + exclude: Option>, +} + +impl<'a> ModuleFilter<'a> { + pub fn new(block: Vec<&'a str>, exclude: Option>) -> Self { + Self { block, exclude } + } -impl<'a> NoModuleFilter<'a> { #[inline] pub fn filter(&self, record: &Record) -> bool { - if let Some(module) = record.module_path() { - for blocked in self.0.iter() { - if module.len() >= blocked.len() && module.as_bytes()[..blocked.len()] == blocked.as_bytes()[..] { - return false; - } - } + let Some(module) = record.module_path() else { + return true; + }; + + // 优先检查排除(白名单) + if let Some(excludes) = &self.exclude + && excludes.iter().any(|e| module.starts_with(e)) + { + return true; } - true + + // 再检查阻止(黑名单) + !self.block.iter().any(|b| module.starts_with(b)) } } -impl<'a> LogLineFilter for NoModuleFilter<'a> { +impl<'a> LogLineFilter for ModuleFilter<'a> { #[inline] fn write( &self, diff --git a/src-tauri/src/core/logger.rs b/src-tauri/src/core/logger.rs index 5119545c0..5bee2c193 100644 --- a/src-tauri/src/core/logger.rs +++ b/src-tauri/src/core/logger.rs @@ -94,7 +94,10 @@ impl Logger { filter_modules.push("tauri"); #[cfg(feature = "tracing")] filter_modules.extend(["tauri_plugin_mihomo", "kode_bridge"]); - let logger = logger.filter(Box::new(clash_verge_logging::NoModuleFilter(filter_modules))); + let logger = logger.filter(Box::new(clash_verge_logging::ModuleFilter::new( + filter_modules, + Some(vec!["tauri_plugin_mihomo"]), + ))); let handle = logger.start()?; *self.handle.lock() = Some(handle);