feat: 优化日志Dialog,支持查看实时日志和文件日志

This commit is contained in:
lanyeeee
2026-03-07 06:06:56 +08:00
parent 15cdb30763
commit e757c6b64e
7 changed files with 504 additions and 134 deletions

View File

@@ -1,3 +1,8 @@
use std::{
fs::File,
io::{BufRead, BufReader},
};
use eyre::WrapErr;
use parking_lot::RwLock;
use tauri::AppHandle;
@@ -25,6 +30,7 @@ use crate::{
get_normal_info_params::GetNormalInfoParams,
get_user_video_info_params::GetUserVideoInfoParams,
history_info::HistoryInfo,
log_metadata::LogMetadata,
normal_info::NormalInfo,
qrcode_data::QrcodeData,
qrcode_status::QrcodeStatus,
@@ -467,3 +473,36 @@ pub async fn get_available_media_formats(
Ok(result)
}
#[allow(clippy::needless_pass_by_value)]
#[tauri::command(async)]
#[specta::specta]
#[instrument(level = "error", skip_all, fields(path = path))]
pub fn open_log_file(path: &str) -> CommandResult<Vec<LogMetadata>> {
let log_file = File::open(path).map_err(|err| CommandError::from("打开日志文件失败", err))?;
let reader = BufReader::new(log_file);
let mut logs = Vec::new();
let mut line_num = 0;
for line_result in reader.lines() {
line_num += 1;
let line = line_result
.wrap_err(format!("读取日志文件的第`{line_num}`行失败"))
.map_err(|err| CommandError::from("打开日志文件失败", err))?;
if line.trim().is_empty() {
continue;
}
let log: LogMetadata = serde_json::from_str(&line)
.wrap_err(format!("将日志文件的第`{line_num}`行解析为LogMetadata失败"))
.map_err(|err| CommandError::from("打开日志文件失败", err))?;
logs.push(log);
}
Ok(logs)
}

View File

@@ -30,10 +30,10 @@ use tauri::{Manager, Wry};
use crate::{
bili_client::BiliClient,
commands::open_log_file,
downloader::download_manager::DownloadManager,
errors::install_custom_eyre_handler,
events::{DownloadEvent, LogEvent},
types::log_metadata::LogMetadata,
};
fn generate_context() -> tauri::Context<Wry> {
@@ -72,9 +72,9 @@ pub fn run() {
show_path_in_file_manager,
get_skip_segments,
get_available_media_formats,
open_log_file,
])
.events(tauri_specta::collect_events![LogEvent, DownloadEvent])
.typ::<LogMetadata>();
.events(tauri_specta::collect_events![LogEvent, DownloadEvent]);
#[cfg(debug_assertions)]
builder

View File

@@ -1,5 +1,9 @@
use std::{io::Write, sync::OnceLock};
use crate::{
events::LogEvent,
extensions::{AppHandleExt, EyreReportToMessage},
};
use eyre::{OptionExt, WrapErr};
use notify::{RecommendedWatcher, Watcher};
use tauri::{AppHandle, Manager};
@@ -13,17 +17,12 @@ use tracing_error::ErrorLayer;
use tracing_subscriber::{
Layer, Registry,
filter::{FilterExt, Targets, filter_fn},
fmt::{MakeWriter, layer, time::LocalTime},
fmt::{MakeWriter, format::JsonFields, layer, time::LocalTime},
layer::SubscriberExt,
registry::LookupSpan,
util::SubscriberInitExt,
};
use crate::{
events::LogEvent,
extensions::{AppHandleExt, EyreReportToMessage},
};
struct LogEventWriter {
app: AppHandle,
}
@@ -73,7 +72,8 @@ pub fn init(app: &AppHandle) -> eyre::Result<()> {
.with_writer(std::io::stdout)
.with_timer(LocalTime::rfc_3339())
.with_file(true)
.with_line_number(true);
.with_line_number(true)
.pretty();
// 发送到前端
let log_event_factory = LogEventWriterFactory { app: app.clone() };
let log_event_layer = layer()
@@ -92,7 +92,7 @@ pub fn init(app: &AppHandle) -> eyre::Result<()> {
.with(reloadable_file_layer)
.with(console_layer)
.with(log_event_layer)
.with(ErrorLayer::default())
.with(ErrorLayer::new(JsonFields::default()))
.init();
GUARD.get_or_init(|| parking_lot::Mutex::new(guard));
@@ -138,7 +138,8 @@ where
.with_timer(LocalTime::rfc_3339())
.with_ansi(false)
.with_file(true)
.with_line_number(true);
.with_line_number(true)
.json();
return Ok((Box::new(sink_layer), None));
}
let logs_dir = logs_dir(app).wrap_err("获取日志目录失败")?;
@@ -154,7 +155,8 @@ where
.with_timer(LocalTime::rfc_3339())
.with_ansi(false)
.with_file(true)
.with_line_number(true);
.with_line_number(true)
.json();
Ok((Box::new(file_layer), Some(guard)))
}