feat: add log-to-file
This commit is contained in:
parent
d18cb7ec64
commit
d5b020dcfb
12 changed files with 130 additions and 70 deletions
|
|
@ -5,3 +5,6 @@ pub const CONFIG_WATCH_DELAY_SECS: u32 = 15;
|
|||
#[cfg(feature = "cache")]
|
||||
// Cache directory
|
||||
pub const CACHE_DIR: &str = "./cache";
|
||||
|
||||
pub(crate) const ACCESS_LOG_FILE: &str = "access.log";
|
||||
pub(crate) const SYSTEM_LOG_FILE: &str = "rpxy.log";
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
use crate::constants::{ACCESS_LOG_FILE, SYSTEM_LOG_FILE};
|
||||
use rpxy_lib::log_event_names;
|
||||
use std::str::FromStr;
|
||||
use tracing_subscriber::{fmt, prelude::*};
|
||||
|
||||
|
|
@ -22,10 +24,56 @@ pub fn init_logger(log_dir_path: Option<&str>) {
|
|||
}
|
||||
}
|
||||
|
||||
/// file logging
|
||||
/// file logging TODO:
|
||||
fn init_file_logger(level: tracing::Level, log_dir_path: &str) {
|
||||
// TODO: implement
|
||||
init_stdio_logger(level);
|
||||
let log_dir_path = std::path::PathBuf::from(log_dir_path);
|
||||
// create the directory if it does not exist
|
||||
if !log_dir_path.exists() {
|
||||
println!("Directory does not exist, creating: {}", log_dir_path.display());
|
||||
std::fs::create_dir_all(&log_dir_path).expect("Failed to create log directory");
|
||||
}
|
||||
let access_log_path = log_dir_path.join(ACCESS_LOG_FILE);
|
||||
let system_log_path = log_dir_path.join(SYSTEM_LOG_FILE);
|
||||
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 reg = tracing_subscriber::registry();
|
||||
|
||||
let access_log_base = fmt::layer()
|
||||
.with_line_number(false)
|
||||
.with_thread_ids(false)
|
||||
.with_thread_names(false)
|
||||
.with_target(false)
|
||||
.with_level(false)
|
||||
.compact()
|
||||
.with_ansi(false);
|
||||
let reg = reg.with(access_log_base.with_writer(access_log).with_filter(AccessLogFilter));
|
||||
|
||||
let system_log_base = fmt::layer()
|
||||
.with_line_number(false)
|
||||
.with_thread_ids(false)
|
||||
.with_thread_names(false)
|
||||
.with_target(false)
|
||||
.with_level(true) // with level for system log
|
||||
.compact()
|
||||
.with_ansi(false);
|
||||
let reg = reg.with(
|
||||
system_log_base
|
||||
.with_writer(system_log)
|
||||
.with_filter(tracing_subscriber::filter::filter_fn(move |metadata| {
|
||||
(metadata
|
||||
.target()
|
||||
.starts_with(env!("CARGO_PKG_NAME").replace('-', "_").as_str())
|
||||
&& metadata.name() != log_event_names::ACCESS_LOG
|
||||
&& metadata.level() <= &level)
|
||||
|| metadata.level() <= &tracing::Level::WARN.min(level)
|
||||
})),
|
||||
);
|
||||
|
||||
reg.init();
|
||||
}
|
||||
|
||||
/// stdio logging
|
||||
|
|
@ -64,9 +112,24 @@ fn init_stdio_logger(level: tracing::Level) {
|
|||
};
|
||||
}
|
||||
|
||||
/// Access log filter
|
||||
struct AccessLogFilter;
|
||||
impl<S> tracing_subscriber::layer::Filter<S> for AccessLogFilter {
|
||||
fn enabled(&self, metadata: &tracing::Metadata<'_>, _: &tracing_subscriber::layer::Context<'_, S>) -> bool {
|
||||
metadata
|
||||
.target()
|
||||
.starts_with(env!("CARGO_PKG_NAME").replace('-', "_").as_str())
|
||||
&& metadata.name().contains(log_event_names::ACCESS_LOG)
|
||||
&& metadata.level() <= &tracing::Level::INFO
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Create a file for logging
|
||||
fn open_log_file(path: &str) -> std::fs::File {
|
||||
fn open_log_file<P>(path: P) -> std::fs::File
|
||||
where
|
||||
P: AsRef<std::path::Path>,
|
||||
{
|
||||
// crate a file if it does not exist
|
||||
std::fs::OpenOptions::new()
|
||||
.create(true)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue