Replies: 1 comment
-
I tried using a callback function to reload, it worked, but doesn't feel very elegant. use std::sync::{Mutex, OnceLock};
use std::thread::sleep;
use std::time::Duration;
use tracing::Level;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_appender::rolling::{RollingFileAppender, Rotation};
use tracing_subscriber::filter::Targets;
use tracing_subscriber::fmt::layer;
use tracing_subscriber::fmt::time::LocalTime;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{reload, Layer, Registry};
const LOGS_DIR: &str = "logs";
static RELOAD_FN: OnceLock<Box<dyn Fn() + Send + Sync>> = OnceLock::new();
static GUARD: OnceLock<Mutex<WorkerGuard>> = OnceLock::new();
fn reload_file_log() {
RELOAD_FN.get().unwrap()();
}
fn main() -> anyhow::Result<()> {
let lib_module_path = module_path!();
let lib_target = lib_module_path.split("::").next().unwrap();
let target_filter = Targets::new().with_target(lib_target, Level::TRACE);
let console_layer = layer()
.with_writer(std::io::stdout)
.with_timer(LocalTime::rfc_3339())
.with_file(true)
.with_line_number(true)
.boxed();
let file_appender = RollingFileAppender::builder()
.filename_prefix("main")
.filename_suffix("log")
.rotation(Rotation::DAILY)
.build(LOGS_DIR)?;
let (non_blocking_appender, guard) = tracing_appender::non_blocking(file_appender);
GUARD.get_or_init(move || Mutex::new(guard));
let file_layer = layer()
.with_writer(non_blocking_appender)
.with_timer(LocalTime::rfc_3339())
.with_ansi(false)
.with_file(true)
.with_line_number(true)
.boxed();
let (reloadable_file_layer, reload_handle) = reload::Layer::new(file_layer);
Registry::default()
.with(target_filter)
.with(console_layer)
.with(reloadable_file_layer)
.init();
RELOAD_FN.get_or_init(move || {
Box::new(move || {
let file_appender = RollingFileAppender::builder()
.filename_prefix("reload")
.filename_suffix("log")
.rotation(Rotation::DAILY)
.build(LOGS_DIR)
.unwrap();
let (non_blocking_appender, guard) = tracing_appender::non_blocking(file_appender);
let file_layer = layer()
.with_writer(non_blocking_appender)
.with_timer(LocalTime::rfc_3339())
.with_ansi(false)
.with_file(true)
.with_line_number(true)
.boxed();
reload_handle.reload(file_layer).unwrap();
*GUARD.get().unwrap().lock().unwrap() = guard;
})
});
std::thread::spawn(|| {
sleep(Duration::from_secs(5));
reload_file_log()
});
for i in 0..10 {
tracing::info!("hello {}", i);
sleep(Duration::from_secs(1));
}
Ok(())
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
When using
tracing_subscriber::reload::Handle
, the type can become extremely complexThe type complexity increases based on the order of layer registration
How to properly store and use
tracing_subscriber::reload::Handle
for dynamic log file reloading?Reloadable layer registered before the console layer:
Reloadable layer registered after the console layer:
Code(Reloadable layer registered before the console layer)
Did I do something wrong?
Beta Was this translation helpful? Give feedback.
All reactions