Refactor logging to use a centralized logging utility across the application (#5277)

- Replaced direct log calls with a new logging macro that includes a logging type for better categorization.
- Updated logging in various modules including `merge.rs`, `mod.rs`, `tun.rs`, `clash.rs`, `profile.rs`, `proxy.rs`, `window.rs`, `lightweight.rs`, `guard.rs`, `autostart.rs`, `dirs.rs`, `dns.rs`, `scheme.rs`, `server.rs`, and `window_manager.rs`.
- Introduced logging types such as `Core`, `Network`, `ProxyMode`, `Window`, `Lightweight`, `Service`, and `File` to enhance log clarity and filtering.
This commit is contained in:
Tunglies
2025-11-01 20:47:01 +08:00
committed by GitHub
Unverified
parent 50567d9b97
commit fb260fb33d
28 changed files with 473 additions and 210 deletions

View File

@@ -1,7 +1,7 @@
use crate::{
config::Config,
core::{CoreManager, handle, tray},
logging_error,
logging, logging_error,
process::AsyncHandler,
utils::{self, logging::Type, resolve},
};
@@ -17,7 +17,7 @@ pub async fn restart_clash_core() {
}
Err(err) => {
handle::Handle::notice_message("set_config::error", format!("{err}"));
log::error!(target:"app", "{err}");
logging!(error, Type::Core, "{err}");
}
}
}
@@ -30,7 +30,7 @@ pub async fn restart_app() {
"restart_app::error",
format!("Failed to cleanup resources: {err}"),
);
log::error!(target:"app", "Restart failed during cleanup: {err}");
logging!(error, Type::Core, "Restart failed during cleanup: {err}");
return;
}
@@ -50,7 +50,7 @@ fn after_change_clash_mode() {
}
}
Err(err) => {
log::error!(target: "app", "Failed to get connections: {err}");
logging!(error, Type::Core, "Failed to get connections: {err}");
}
}
});
@@ -64,7 +64,7 @@ pub async fn change_clash_mode(mode: String) {
let json_value = serde_json::json!({
"mode": mode
});
log::debug!(target: "app", "change clash mode to {mode}");
logging!(debug, Type::Core, "change clash mode to {mode}");
match handle::Handle::mihomo()
.await
.patch_base_config(&json_value)
@@ -91,7 +91,7 @@ pub async fn change_clash_mode(mode: String) {
after_change_clash_mode();
}
}
Err(err) => log::error!(target: "app", "{err}"),
Err(err) => logging!(error, Type::Core, "{err}"),
}
}
@@ -123,7 +123,7 @@ pub async fn test_delay(url: String) -> anyhow::Result<u32> {
match response {
Ok(response) => {
log::trace!(target: "app", "test_delay response: {response:#?}");
logging!(trace, Type::Network, "test_delay response: {response:#?}");
if response.status().is_success() {
Ok(start.elapsed().as_millis() as u32)
} else {
@@ -131,7 +131,7 @@ pub async fn test_delay(url: String) -> anyhow::Result<u32> {
}
}
Err(err) => {
log::trace!(target: "app", "test_delay error: {err:#?}");
logging!(trace, Type::Network, "test_delay error: {err:#?}");
Err(err)
}
}

View File

@@ -18,7 +18,7 @@ pub async fn toggle_proxy_profile(profile_index: String) {
}
}
Err(err) => {
log::error!(target: "app", "{err}");
logging!(error, Type::Tray, "{err}");
}
}
}
@@ -33,10 +33,18 @@ async fn should_update_profile(
let is_remote = item.itype.as_ref().is_some_and(|s| s == "remote");
if !is_remote {
log::info!(target: "app", "[订阅更新] {uid} 不是远程订阅,跳过更新");
logging!(
info,
Type::Config,
"[订阅更新] {uid} 不是远程订阅,跳过更新"
);
Ok(None)
} else if item.url.is_none() {
log::warn!(target: "app", "[订阅更新] {uid} 缺少URL无法更新");
logging!(
warn,
Type::Config,
"Warning: [订阅更新] {uid} 缺少URL无法更新"
);
bail!("failed to get the profile item url");
} else if !ignore_auto_update
&& !item
@@ -45,13 +53,22 @@ async fn should_update_profile(
.and_then(|o| o.allow_auto_update)
.unwrap_or(true)
{
log::info!(target: "app", "[订阅更新] {} 禁止自动更新,跳过更新", uid);
logging!(
info,
Type::Config,
"[订阅更新] {} 禁止自动更新,跳过更新",
uid
);
Ok(None)
} else {
log::info!(target: "app",
logging!(
info,
Type::Config,
"[订阅更新] {} 是远程订阅URL: {}",
uid,
item.url.clone().ok_or_else(|| anyhow::anyhow!("Profile URL is None"))?
item.url
.clone()
.ok_or_else(|| anyhow::anyhow!("Profile URL is None"))?
);
Ok(Some((
item.url
@@ -68,20 +85,28 @@ async fn perform_profile_update(
opt: Option<&PrfOption>,
option: Option<&PrfOption>,
) -> Result<bool> {
log::info!(target: "app", "[订阅更新] 开始下载新的订阅内容");
logging!(info, Type::Config, "[订阅更新] 开始下载新的订阅内容");
let merged_opt = PrfOption::merge(opt, option);
match PrfItem::from_url(url, None, None, merged_opt.as_ref()).await {
Ok(mut item) => {
log::info!(target: "app", "[订阅更新] 更新订阅配置成功");
logging!(info, Type::Config, "[订阅更新] 更新订阅配置成功");
let profiles = Config::profiles().await;
profiles_draft_update_item_safe(uid, &mut item).await?;
let is_current = Some(uid.clone()) == profiles.latest_ref().get_current();
log::info!(target: "app", "[订阅更新] 是否为当前使用的订阅: {is_current}");
logging!(
info,
Type::Config,
"[订阅更新] 是否为当前使用的订阅: {is_current}"
);
Ok(is_current)
}
Err(err) => {
log::warn!(target: "app", "[订阅更新] 正常更新失败: {err}尝试使用Clash代理更新");
logging!(
warn,
Type::Config,
"Warning: [订阅更新] 正常更新失败: {err}尝试使用Clash代理更新"
);
handle::Handle::notice_message("update_retry_with_clash", uid.clone());
let original_with_proxy = merged_opt.as_ref().and_then(|o| o.with_proxy);
@@ -93,7 +118,7 @@ async fn perform_profile_update(
match PrfItem::from_url(url, None, None, Some(&fallback_opt)).await {
Ok(mut item) => {
log::info!(target: "app", "[订阅更新] 使用Clash代理更新成功");
logging!(info, Type::Config, "[订阅更新] 使用Clash代理更新成功");
if let Some(option) = item.option.as_mut() {
option.with_proxy = original_with_proxy;
@@ -107,11 +132,19 @@ async fn perform_profile_update(
handle::Handle::notice_message("update_with_clash_proxy", profile_name);
let is_current = Some(uid.clone()) == profiles.latest_ref().get_current();
log::info!(target: "app", "[订阅更新] 是否为当前使用的订阅: {is_current}");
logging!(
info,
Type::Config,
"[订阅更新] 是否为当前使用的订阅: {is_current}"
);
Ok(is_current)
}
Err(retry_err) => {
log::error!(target: "app", "[订阅更新] 使用Clash代理更新仍然失败: {retry_err}");
logging!(
error,
Type::Config,
"[订阅更新] 使用Clash代理更新仍然失败: {retry_err}"
);
handle::Handle::notice_message(
"update_failed_even_with_clash",
format!("{retry_err}"),
@@ -149,7 +182,7 @@ pub async fn update_profile(
Err(err) => {
logging!(error, Type::Config, "[订阅更新] 更新失败: {}", err);
handle::Handle::notice_message("update_failed", format!("{err}"));
log::error!(target: "app", "{err}");
logging!(error, Type::Config, "{err}");
}
}
}

View File

@@ -1,6 +1,8 @@
use crate::{
config::{Config, IVerge},
core::handle,
logging,
utils::logging::Type,
};
use std::env;
use tauri_plugin_clipboard_manager::ClipboardExt;
@@ -16,7 +18,11 @@ pub async fn toggle_system_proxy() {
&& auto_close_connection
&& let Err(err) = handle::Handle::mihomo().await.close_all_connections().await
{
log::error!(target: "app", "Failed to close all connections: {err}");
logging!(
error,
Type::ProxyMode,
"Failed to close all connections: {err}"
);
}
let patch_result = super::patch_verge(
@@ -30,7 +36,7 @@ pub async fn toggle_system_proxy() {
match patch_result {
Ok(_) => handle::Handle::refresh_verge(),
Err(err) => log::error!(target: "app", "{err}"),
Err(err) => logging!(error, Type::ProxyMode, "{err}"),
}
}
@@ -49,7 +55,7 @@ pub async fn toggle_tun_mode(not_save_file: Option<bool>) {
.await
{
Ok(_) => handle::Handle::refresh_verge(),
Err(err) => log::error!(target: "app", "{err}"),
Err(err) => logging!(error, Type::ProxyMode, "{err}"),
}
}
@@ -104,12 +110,16 @@ pub async fn copy_clash_env() {
}
"fish" => format!("set -x http_proxy {http_proxy}; set -x https_proxy {http_proxy}"),
_ => {
log::error!(target: "app", "copy_clash_env: Invalid env type! {env_type}");
logging!(
error,
Type::ProxyMode,
"copy_clash_env: Invalid env type! {env_type}"
);
return;
}
};
if cliboard.write_text(export_text).is_err() {
log::error!(target: "app", "Failed to write to clipboard");
logging!(error, Type::ProxyMode, "Failed to write to clipboard");
}
}

View File

@@ -14,7 +14,7 @@ pub async fn open_or_close_dashboard() {
async fn open_or_close_dashboard_internal() {
let _ = lightweight::exit_lightweight_mode().await;
let result = WindowManager::toggle_main_window().await;
log::info!(target: "app", "Window toggle result: {result:?}");
logging!(info, Type::Window, "Window toggle result: {result:?}");
}
pub async fn quit() {
@@ -71,16 +71,20 @@ pub async fn clean_async() -> bool {
.await
{
Ok(Ok(_)) => {
log::info!(target: "app", "TUN模式已禁用");
logging!(info, Type::Window, "TUN模式已禁用");
true
}
Ok(Err(e)) => {
log::warn!(target: "app", "禁用TUN模式失败: {e}");
logging!(warn, Type::Window, "Warning: 禁用TUN模式失败: {e}");
// 超时不阻塞退出
true
}
Err(_) => {
log::warn!(target: "app", "禁用TUN模式超时可能系统正在关机继续退出流程");
logging!(
warn,
Type::Window,
"Warning: 禁用TUN模式超时可能系统正在关机继续退出流程"
);
true
}
}
@@ -101,7 +105,7 @@ pub async fn clean_async() -> bool {
.unwrap_or(false);
if !sys_proxy_enabled {
log::info!(target: "app", "系统代理未启用,跳过重置");
logging!(info, Type::Window, "系统代理未启用,跳过重置");
return true;
}
@@ -110,19 +114,23 @@ pub async fn clean_async() -> bool {
if is_shutting_down {
// sysproxy-rs 操作注册表(避免.exe的dll错误)
log::info!(target: "app", "检测到正在关机syspro-rs操作注册表关闭系统代理");
logging!(
info,
Type::Window,
"检测到正在关机syspro-rs操作注册表关闭系统代理"
);
match Sysproxy::get_system_proxy() {
Ok(mut sysproxy) => {
sysproxy.enable = false;
if let Err(e) = sysproxy.set_system_proxy() {
log::warn!(target: "app", "关机时关闭系统代理失败: {e}");
logging!(warn, Type::Window, "Warning: 关机时关闭系统代理失败: {e}");
} else {
log::info!(target: "app", "系统代理已关闭(通过注册表)");
logging!(info, Type::Window, "系统代理已关闭(通过注册表)");
}
}
Err(e) => {
log::warn!(target: "app", "关机时获取代理设置失败: {e}");
logging!(warn, Type::Window, "Warning: 关机时获取代理设置失败: {e}");
}
}
@@ -136,7 +144,7 @@ pub async fn clean_async() -> bool {
}
// 正常退出:使用 sysproxy.exe 重置代理
log::info!(target: "app", "sysproxy.exe重置系统代理");
logging!(info, Type::Window, "sysproxy.exe重置系统代理");
match timeout(
Duration::from_secs(2),
@@ -145,15 +153,19 @@ pub async fn clean_async() -> bool {
.await
{
Ok(Ok(_)) => {
log::info!(target: "app", "系统代理已重置");
logging!(info, Type::Window, "系统代理已重置");
true
}
Ok(Err(e)) => {
log::warn!(target: "app", "重置系统代理失败: {e}");
logging!(warn, Type::Window, "Warning: 重置系统代理失败: {e}");
true
}
Err(_) => {
log::warn!(target: "app", "重置系统代理超时,继续退出流程");
logging!(
warn,
Type::Window,
"Warning: 重置系统代理超时,继续退出流程"
);
true
}
}
@@ -169,11 +181,11 @@ pub async fn clean_async() -> bool {
.unwrap_or(false);
if !sys_proxy_enabled {
log::info!(target: "app", "系统代理未启用,跳过重置");
logging!(info, Type::Window, "系统代理未启用,跳过重置");
return true;
}
log::info!(target: "app", "开始重置系统代理...");
logging!(info, Type::Window, "开始重置系统代理...");
match timeout(
Duration::from_millis(1500),
@@ -182,15 +194,15 @@ pub async fn clean_async() -> bool {
.await
{
Ok(Ok(_)) => {
log::info!(target: "app", "系统代理已重置");
logging!(info, Type::Window, "系统代理已重置");
true
}
Ok(Err(e)) => {
log::warn!(target: "app", "重置系统代理失败: {e}");
logging!(warn, Type::Window, "Warning: 重置系统代理失败: {e}");
true
}
Err(_) => {
log::warn!(target: "app", "重置系统代理超时,继续退出");
logging!(warn, Type::Window, "Warning: 重置系统代理超时,继续退出");
true
}
}
@@ -206,11 +218,15 @@ pub async fn clean_async() -> bool {
match timeout(stop_timeout, CoreManager::global().stop_core()).await {
Ok(_) => {
log::info!(target: "app", "core已停止");
logging!(info, Type::Window, "core已停止");
true
}
Err(_) => {
log::warn!(target: "app", "停止core超时可能系统正在关机继续退出");
logging!(
warn,
Type::Window,
"Warning: 停止core超时可能系统正在关机继续退出"
);
true
}
}
@@ -226,11 +242,11 @@ pub async fn clean_async() -> bool {
.await
{
Ok(_) => {
log::info!(target: "app", "DNS设置已恢复");
logging!(info, Type::Window, "DNS设置已恢复");
true
}
Err(_) => {
log::warn!(target: "app", "恢复DNS设置超时");
logging!(warn, Type::Window, "Warning: 恢复DNS设置超时");
false
}
}