diff --git a/Cargo.lock b/Cargo.lock index 97460059..6664d0b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -569,6 +569,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -2112,6 +2121,7 @@ dependencies = [ "tokio-util", "toml", "tracing", + "tracing-appender", "tracing-subscriber", ] @@ -3041,6 +3051,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.29" diff --git a/rpxy-bin/Cargo.toml b/rpxy-bin/Cargo.toml index e22b8e15..c79a0c65 100644 --- a/rpxy-bin/Cargo.toml +++ b/rpxy-bin/Cargo.toml @@ -68,6 +68,7 @@ serde_ignored = "0.1.12" # logging tracing = { version = "0.1.41" } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } +tracing-appender = "0.2.3" ################################ # cert management diff --git a/rpxy-bin/src/log.rs b/rpxy-bin/src/log.rs index 29e19933..d1b4e353 100644 --- a/rpxy-bin/src/log.rs +++ b/rpxy-bin/src/log.rs @@ -1,6 +1,7 @@ use crate::constants::{ACCESS_LOG_FILE, SYSTEM_LOG_FILE}; use rpxy_lib::log_event_names; -use std::str::FromStr; +use std::{str::FromStr, sync::OnceLock}; +use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::{filter::filter_fn, fmt, prelude::*}; #[allow(unused)] @@ -19,6 +20,9 @@ pub fn init_logger(log_dir_path: Option<&str>) { } } +static ACCESS_LOG_GUARD: OnceLock = OnceLock::new(); +static SYSTEM_LOG_GUARD: OnceLock = OnceLock::new(); + /// file logging fn init_file_logger(level: tracing::Level, log_dir_path: &str) { println!("Activate logging to files: {}", log_dir_path); @@ -35,8 +39,12 @@ fn init_file_logger(level: tracing::Level, log_dir_path: &str) { println!("Access log: {}", access_log_path.display()); println!("System and error log: {}", system_log_path.display()); - let access_log = open_log_file(&access_log_path); - let system_log = open_log_file(&system_log_path); + let access_log_appender = tracing_appender::rolling::daily(&log_dir_path, ACCESS_LOG_FILE); + let (access_non_blocking, guard) = tracing_appender::non_blocking(access_log_appender); + _ = ACCESS_LOG_GUARD.set(guard); + let system_log_appender = tracing_appender::rolling::daily(log_dir_path, SYSTEM_LOG_FILE); + let (system_non_blocking, guard) = tracing_appender::non_blocking(system_log_appender); + _ = SYSTEM_LOG_GUARD.set(guard); let access_layer = fmt::layer() .with_line_number(false) @@ -46,7 +54,7 @@ fn init_file_logger(level: tracing::Level, log_dir_path: &str) { .with_level(false) .compact() .with_ansi(false) - .with_writer(access_log) + .with_writer(access_non_blocking) .with_filter(AccessLogFilter); let system_layer = fmt::layer() @@ -57,7 +65,7 @@ fn init_file_logger(level: tracing::Level, log_dir_path: &str) { .with_level(true) .compact() .with_ansi(false) - .with_writer(system_log) + .with_writer(system_non_blocking) .with_filter(filter_fn(move |metadata| { (is_cargo_pkg(metadata) && metadata.name() != log_event_names::ACCESS_LOG && metadata.level() <= &level) || metadata.level() <= &tracing::Level::WARN.min(level) @@ -104,20 +112,6 @@ impl tracing_subscriber::layer::Filter for AccessLogFilter { } } -#[inline] -/// Create a file for logging -fn open_log_file

(path: P) -> std::fs::File -where - P: AsRef, -{ - // create a file if it does not exist - std::fs::OpenOptions::new() - .create(true) - .append(true) - .open(path) - .expect("Failed to open the log file") -} - #[inline] /// Matches cargo package name with `_` instead of `-` fn is_cargo_pkg(metadata: &tracing::Metadata<'_>) -> bool {