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
Uh oh!
There was an error while loading. Please reload this page.
-
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