logger creates file

This commit is contained in:
2026-03-30 14:34:21 +07:00
parent 1f97db97c4
commit 71acb52386
6 changed files with 116 additions and 8 deletions
+38 -5
View File
@@ -1,5 +1,6 @@
use std::sync::{Once, OnceLock};
pub use tracing::{debug, error, info, instrument, span, trace, warn};
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{
fmt, layer::SubscriberExt, reload::Handle, util::SubscriberInitExt, EnvFilter, Registry,
};
@@ -7,20 +8,41 @@ type ReloadableFilter = Handle<EnvFilter, Registry>;
pub struct Logger {
filter_handle: ReloadableFilter,
_guard: Option<WorkerGuard>,
}
static INIT: Once = Once::new();
static LOGGER: OnceLock<Logger> = OnceLock::new();
impl Logger {
pub fn init() {
pub fn init(log_dir: Option<&str>) {
INIT.call_once(|| {
let filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
let (filter, handle) = tracing_subscriber::reload::Layer::new(filter);
let (filter_layer, handle) = tracing_subscriber::reload::Layer::new(filter);
let registry = tracing_subscriber::registry().with(filter);
let mut file_guard = None;
let mut file_layer = None;
// Настраиваем запись в файл, если передан путь
if let Some(path) = log_dir {
// Ротация: новый файл каждый день, префикс "netrunner.log"
let file_appender = tracing_appender::rolling::daily(path, "netrunner.log");
let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
file_layer = Some(
fmt::layer()
.with_writer(non_blocking)
.with_ansi(false) // В файле цвета не нужны
.with_target(true)
.with_line_number(true),
);
file_guard = Some(guard);
}
let registry = tracing_subscriber::registry().with(filter_layer);
// Слой для Android
#[cfg(target_os = "android")]
let registry = {
let android_layer = tracing_android::layer("NETRUNNER_RUST")
@@ -28,6 +50,7 @@ impl Logger {
registry.with(android_layer)
};
// Слой для консоли (Desktop/Server)
#[cfg(not(target_os = "android"))]
let registry = {
let fmt_layer = fmt::layer()
@@ -38,12 +61,22 @@ impl Logger {
registry.with(fmt_layer)
};
registry.init();
// Добавляем файловый слой, если он был создан
if let Some(f_layer) = file_layer {
registry.with(f_layer).init();
} else {
registry.init();
}
let _ = LOGGER.set(Logger {
filter_handle: handle,
_guard: file_guard,
});
eprintln!("--- [DEBUG] Logger initialized ---");
eprintln!(
"--- [DEBUG] Logger initialized (File logging: {}) ---",
log_dir.is_some()
);
});
}