mirror of
https://github.com/lanyeeee/bilibili-video-downloader.git
synced 2026-05-06 20:02:57 +08:00
feat: 优化日志Dialog,支持查看实时日志和文件日志
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user