diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs
index 7adc356a354ad3cecbba20a8634f6b81240e16de..893e26184539c83452d82a82070a734f01cce562 100644
--- a/src-tauri/src/core/mod.rs
+++ b/src-tauri/src/core/mod.rs
@@ -418,7 +418,7 @@ impl Core {
       let result = event.payload();
 
       if result.is_none() {
-        log::warn!("event payload result is none");
+        log::warn!(target: "app", "event payload result is none");
         return;
       }
 
@@ -438,10 +438,10 @@ impl Core {
         let service = service.lock();
         log_if_err!(service.set_config(info, config, notice));
 
-        log::info!("profile enhanced status {}", result.status);
+        log::info!(target: "app", "profile enhanced status {}", result.status);
       }
 
-      result.error.map(|err| log::error!("{err}"));
+      result.error.map(|err| log::error!(target: "app", "{err}"));
     });
 
     let verge = self.verge.lock();
diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs
index adfb906f59ea96a548cc77d57a8a485e21f2d36c..64bec643fbcbad51ac5fab9cdf47dbe398e3e803 100644
--- a/src-tauri/src/core/service.rs
+++ b/src-tauri/src/core/service.rs
@@ -53,12 +53,10 @@ impl Service {
         Ok(status) => {
           // 未启动clash
           if status.code != 0 {
-            if let Err(err) = Self::start_clash_by_service().await {
-              log::error!("{err}");
-            }
+            log_if_err!(Self::start_clash_by_service().await);
           }
         }
-        Err(err) => log::error!("{err}"),
+        Err(err) => log::error!(target: "app", "{err}"),
       }
     });
 
@@ -77,9 +75,7 @@ impl Service {
     }
 
     tauri::async_runtime::spawn(async move {
-      if let Err(err) = Self::stop_clash_by_service().await {
-        log::error!("{err}");
-      }
+      log_if_err!(Self::stop_clash_by_service().await);
     });
 
     Ok(())
@@ -109,8 +105,11 @@ impl Service {
     tauri::async_runtime::spawn(async move {
       while let Some(event) = rx.recv().await {
         match event {
-          CommandEvent::Stdout(line) => log::info!("[clash]: {}", line),
-          CommandEvent::Stderr(err) => log::error!("[clash]: {}", err),
+          CommandEvent::Stdout(line) => {
+            let stdout = if line.len() > 33 { &line[33..] } else { &line };
+            log::info!(target: "app" ,"[clash]: {}", stdout);
+          }
+          CommandEvent::Stderr(err) => log::error!(target: "app" ,"[clash error]: {}", err),
           _ => {}
         }
       }
@@ -152,7 +151,7 @@ impl Service {
             match builder.send().await {
               Ok(resp) => {
                 if resp.status() != 204 {
-                  log::error!("failed to activate clash with status \"{}\"", resp.status());
+                  log::error!(target: "app", "failed to activate clash with status \"{}\"", resp.status());
                 }
 
                 notice.refresh_clash();
@@ -160,10 +159,10 @@ impl Service {
                 // do not retry
                 break;
               }
-              Err(err) => log::error!("failed to activate for `{err}`"),
+              Err(err) => log::error!(target: "app", "failed to activate for `{err}`"),
             }
           }
-          Err(err) => log::error!("failed to activate for `{err}`"),
+          Err(err) => log::error!(target: "app", "failed to activate for `{err}`"),
         }
         sleep(Duration::from_millis(500)).await;
       }
@@ -186,7 +185,7 @@ impl Service {
 
         match builder.send().await {
           Ok(_) => notice.refresh_clash(),
-          Err(err) => log::error!("{err}"),
+          Err(err) => log::error!(target: "app", "{err}"),
         }
       }
     });
diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs
index 365a75b90d885f23dab654f2afb2946cd0783327..e1f1c36f0779fe56e17cccaa5e12a3dc5b6b4e15 100644
--- a/src-tauri/src/core/sysopt.rs
+++ b/src-tauri/src/core/sysopt.rs
@@ -2,7 +2,6 @@ use super::{Clash, Verge};
 use crate::{log_if_err, utils::sysopt::SysProxyConfig};
 use anyhow::{bail, Result};
 use auto_launch::{AutoLaunch, AutoLaunchBuilder};
-// use parking_lot::Mutex;
 use std::sync::Arc;
 use tauri::{async_runtime::Mutex, utils::platform::current_exe};
 
@@ -46,7 +45,7 @@ impl Sysopt {
 
       if enable {
         if let Err(err) = sysproxy.set_sys() {
-          log::error!("failed to set system proxy for `{err}`");
+          log::error!(target: "app", "failed to set system proxy for `{err}`");
         }
       }
 
@@ -90,7 +89,7 @@ impl Sysopt {
     if let Some(sysproxy) = self.old_sysproxy.take() {
       match sysproxy.set_sys() {
         Ok(_) => self.cur_sysproxy = None,
-        Err(_) => log::error!("failed to reset proxy"),
+        Err(_) => log::error!(target: "app", "failed to reset proxy"),
       }
     }
   }
@@ -183,7 +182,7 @@ impl Sysopt {
           break;
         }
 
-        log::debug!("try to guard the system proxy");
+        log::debug!(target: "app", "try to guard the system proxy");
 
         let clash = Clash::new();
 
@@ -194,7 +193,7 @@ impl Sysopt {
 
             log_if_err!(sysproxy.set_sys());
           }
-          None => log::error!("failed to parse clash port"),
+          None => log::error!(target: "app", "failed to parse clash port"),
         }
       }
 
diff --git a/src-tauri/src/core/timer.rs b/src-tauri/src/core/timer.rs
index 5bb0bbdbc2018a9b7d80bf0087689a708a859e25..0d3d5c503a5339f0156332bd5d3ea62012c27026 100644
--- a/src-tauri/src/core/timer.rs
+++ b/src-tauri/src/core/timer.rs
@@ -139,7 +139,7 @@ impl Timer {
 
   /// the task runner
   async fn async_task(core: Core, uid: String) {
-    log::info!("running timer task `{uid}`");
+    log::info!(target: "app", "running timer task `{uid}`");
     log_if_err!(Core::update_profile_item(core, uid, None).await);
   }
 }
diff --git a/src-tauri/src/utils/config.rs b/src-tauri/src/utils/config.rs
index 38c03e073bf5712fe4f2fc93e0c4bb4264a8cd8e..12e3d6d3f90768ab48ab3069b1c9ef3b38c1a83b 100644
--- a/src-tauri/src/utils/config.rs
+++ b/src-tauri/src/utils/config.rs
@@ -5,7 +5,7 @@ use std::{fs, path::PathBuf};
 /// read data from yaml as struct T
 pub fn read_yaml<T: DeserializeOwned + Default>(path: PathBuf) -> T {
   if !path.exists() {
-    log::error!("file not found \"{}\"", path.display());
+    log::error!(target: "app", "file not found \"{}\"", path.display());
     return T::default();
   }
 
@@ -14,7 +14,7 @@ pub fn read_yaml<T: DeserializeOwned + Default>(path: PathBuf) -> T {
   match serde_yaml::from_str::<T>(&yaml_str) {
     Ok(val) => val,
     Err(_) => {
-      log::error!("failed to read yaml file \"{}\"", path.display());
+      log::error!(target: "app", "failed to read yaml file \"{}\"", path.display());
       T::default()
     }
   }
diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs
index 0b7dacbaf5eaaead6dab107401e52b024f88bea9..3d23a7611567ccb2d811f349d2a4e215fc3bdd25 100644
--- a/src-tauri/src/utils/help.rs
+++ b/src-tauri/src/utils/help.rs
@@ -80,7 +80,7 @@ pub fn open_file(path: PathBuf) -> Result<()> {
 macro_rules! log_if_err {
   ($result: expr) => {
     if let Err(err) = $result {
-      log::error!("{err}");
+      log::error!(target: "app", "{err}");
     }
   };
 }
@@ -93,7 +93,7 @@ macro_rules! wrap_err {
     match $stat {
       Ok(a) => Ok(a),
       Err(err) => {
-        log::error!("{}", err.to_string());
+        log::error!(target: "app", "{}", err.to_string());
         Err(format!("{}", err.to_string()))
       }
     }
diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs
index d44bee07534b087d21530c72cf0d17fba9bdf021..f301512dba5b4014c7335e0aaa4e169afc303a0b 100644
--- a/src-tauri/src/utils/init.rs
+++ b/src-tauri/src/utils/init.rs
@@ -3,7 +3,7 @@ use chrono::Local;
 use log::LevelFilter;
 use log4rs::append::console::ConsoleAppender;
 use log4rs::append::file::FileAppender;
-use log4rs::config::{Appender, Config, Root};
+use log4rs::config::{Appender, Config, Logger, Root};
 use log4rs::encode::pattern::PatternEncoder;
 use std::fs;
 use std::io::Write;
@@ -28,11 +28,13 @@ fn init_log(log_dir: &PathBuf) {
   let config = Config::builder()
     .appender(Appender::builder().build("stdout", Box::new(stdout)))
     .appender(Appender::builder().build("file", Box::new(tofile)))
-    .build(
-      Root::builder()
-        .appenders(["stdout", "file"])
-        .build(LevelFilter::Info),
+    .logger(
+      Logger::builder()
+        .appenders(["file", "stdout"])
+        .additive(false)
+        .build("app", LevelFilter::Info),
     )
+    .build(Root::builder().appender("stdout").build(LevelFilter::Info))
     .unwrap();
 
   log4rs::init_config(config).unwrap();
@@ -78,7 +80,7 @@ pub fn init_app(package_info: &PackageInfo) {
 
   init_log(&log_dir);
   if let Err(err) = init_config(&app_dir) {
-    log::error!("{err}");
+    log::error!(target: "app", "{err}");
   }
 
   // copy the resource file
diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs
index b35a0436db45badeac9eb3f25f4ff22c8125abf4..0ef62b79725b94f61451b3e9c8937b32bb9422e3 100644
--- a/src-tauri/src/utils/resolve.rs
+++ b/src-tauri/src/utils/resolve.rs
@@ -111,7 +111,7 @@ pub fn create_window(app_handle: &AppHandle) {
           }
         });
       }
-      Err(err) => log::error!("{err}"),
+      Err(err) => log::error!(target: "app", "{err}"),
     }
   }