feat(logger): enhance logging format and add panic hook

This commit is contained in:
PandaDEV 2024-12-25 21:14:55 +10:00
parent a0cbd13f53
commit 18ca53ef04
No known key found for this signature in database
GPG key ID: 13EFF9BAF70EE75C

View file

@ -2,6 +2,7 @@ use chrono;
use log::{LevelFilter, SetLoggerError}; use log::{LevelFilter, SetLoggerError};
use std::fs::{File, OpenOptions}; use std::fs::{File, OpenOptions};
use std::io::Write; use std::io::Write;
use std::panic;
pub struct FileLogger { pub struct FileLogger {
file: File, file: File,
@ -15,14 +16,18 @@ impl log::Log for FileLogger {
fn log(&self, record: &log::Record) { fn log(&self, record: &log::Record) {
if self.enabled(record.metadata()) { if self.enabled(record.metadata()) {
let mut file = self.file.try_clone().expect("Failed to clone file handle"); let mut file = self.file.try_clone().expect("Failed to clone file handle");
// Format: timestamp [LEVEL] target: message (file:line)
writeln!( writeln!(
file, file,
"{} - {}: {}", "{} [{:<5}] {}: {} ({}:{})",
chrono::Local::now().format("%Y-%m-%d %H:%M:%S"), chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
record.level(), record.level(),
record.args() record.target(),
) record.args(),
.expect("Failed to write to log file"); record.file().unwrap_or("unknown"),
record.line().unwrap_or(0)
).expect("Failed to write to log file");
} }
} }
@ -35,13 +40,40 @@ pub fn init_logger(app_data_dir: &std::path::Path) -> Result<(), SetLoggerError>
let logs_dir = app_data_dir.join("logs"); let logs_dir = app_data_dir.join("logs");
std::fs::create_dir_all(&logs_dir).expect("Failed to create logs directory"); std::fs::create_dir_all(&logs_dir).expect("Failed to create logs directory");
// Use .log extension for standard log files
let log_path = logs_dir.join("app.log"); let log_path = logs_dir.join("app.log");
let file = OpenOptions::new() let file = OpenOptions::new()
.create(true) .create(true)
.append(true) .append(true) // Use append mode instead of write
.open(log_path) .open(&log_path)
.expect("Failed to open log file"); .expect("Failed to open log file");
// Set up panic hook
let panic_file = file.try_clone().expect("Failed to clone file handle");
panic::set_hook(Box::new(move |panic_info| {
let mut file = panic_file.try_clone().expect("Failed to clone file handle");
let location = panic_info.location()
.map(|loc| format!("{}:{}:{}", loc.file(), loc.line(), loc.column()))
.unwrap_or_else(|| "unknown location".to_string());
let message = match panic_info.payload().downcast_ref::<&str>() {
Some(s) => *s,
None => match panic_info.payload().downcast_ref::<String>() {
Some(s) => s.as_str(),
None => "Unknown panic message",
},
};
let _ = writeln!(
file,
"{} [PANIC] rust_panic: {} ({})",
chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
message,
location
);
}));
let logger = Box::new(FileLogger { file }); let logger = Box::new(FileLogger { file });
unsafe { log::set_logger_racy(Box::leak(logger))? }; unsafe { log::set_logger_racy(Box::leak(logger))? };
log::set_max_level(LevelFilter::Debug); log::set_max_level(LevelFilter::Debug);