Add tracing-appender for improved logging with daily rotation.

This commit is contained in:
Greg Burri 2025-04-12 17:27:03 +02:00
parent 9b51998889
commit aebca7a7e2
5 changed files with 74 additions and 47 deletions

58
Cargo.lock generated
View file

@ -389,9 +389,9 @@ dependencies = [
[[package]] [[package]]
name = "bon" name = "bon"
version = "3.5.1" version = "3.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65268237be94042665b92034f979c42d431d2fd998b49809543afe3e66abad1c" checksum = "92c5f8abc69af414cbd6f2103bb668b91e584072f2105e4b38bed79b6ad0975f"
dependencies = [ dependencies = [
"bon-macros", "bon-macros",
"rustversion", "rustversion",
@ -399,9 +399,9 @@ dependencies = [
[[package]] [[package]]
name = "bon-macros" name = "bon-macros"
version = "3.5.1" version = "3.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "803c95b2ecf650eb10b5f87dda6b9f6a1b758cee53245e2b7b825c9b3803a443" checksum = "b69edf39b6f321cb2699a93fc20c256adb839719c42676d03f7aa975e4e5581d"
dependencies = [ dependencies = [
"darling", "darling",
"ident_case", "ident_case",
@ -441,9 +441,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.18" version = "1.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
dependencies = [ dependencies = [
"shlex", "shlex",
] ]
@ -482,9 +482,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.35" version = "4.5.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@ -492,9 +492,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.35" version = "4.5.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@ -630,6 +630,15 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]] [[package]]
name = "crossbeam-queue" name = "crossbeam-queue"
version = "0.3.12" version = "0.3.12"
@ -756,9 +765,9 @@ dependencies = [
[[package]] [[package]]
name = "email-encoding" name = "email-encoding"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20b9cde6a71f9f758440470f3de16db6c09a02c443ce66850d87f5410548fb8e" checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6"
dependencies = [ dependencies = [
"base64", "base64",
"memchr", "memchr",
@ -1674,9 +1683,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.9.3" version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]] [[package]]
name = "litemap" name = "litemap"
@ -1749,9 +1758,9 @@ dependencies = [
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.7" version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
dependencies = [ dependencies = [
"adler2", "adler2",
] ]
@ -2196,6 +2205,7 @@ dependencies = [
"tower", "tower",
"tower-http", "tower-http",
"tracing", "tracing",
"tracing-appender",
"tracing-subscriber", "tracing-subscriber",
] ]
@ -2326,9 +2336,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.25" version = "0.23.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0"
dependencies = [ dependencies = [
"log", "log",
"once_cell", "once_cell",
@ -3166,6 +3176,18 @@ dependencies = [
"tracing-core", "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]] [[package]]
name = "tracing-attributes" name = "tracing-attributes"
version = "0.1.28" version = "0.1.28"

View file

@ -15,6 +15,7 @@ tower-http = { version = "0.6", features = ["fs", "trace"] }
tracing = "0.1" tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing-appender = "0.2"
chrono = { version = "0.4", features = ["serde"] } chrono = { version = "0.4", features = ["serde"] }

View file

@ -18,6 +18,9 @@ pub const DB_FILENAME: &str = "recipes.sqlite";
/// Path to the SQL file which contains the initial database schema. /// Path to the SQL file which contains the initial database schema.
pub const SQL_FILENAME: &str = "sql/version_{VERSION}.sql"; pub const SQL_FILENAME: &str = "sql/version_{VERSION}.sql";
/// Base name for the log files, the date and the extension will be appended to it.
pub const BASE_LOG_FILENAME: &str = "recipes";
/// When a new user sign up, he has this duration to validate his account. /// When a new user sign up, he has this duration to validate his account.
pub const VALIDATION_TOKEN_DURATION: i64 = 60 * 60; // [s]. (1 jour). pub const VALIDATION_TOKEN_DURATION: i64 = 60 * 60; // [s]. (1 jour).

View file

@ -1,9 +1,15 @@
use std::{fs, path::Path}; use std::{fs, path::Path};
use tracing_appender::{
non_blocking::WorkerGuard,
rolling::{RollingFileAppender, Rotation},
};
use tracing_subscriber::{ use tracing_subscriber::{
fmt::writer::MakeWriterExt, layer::SubscriberExt, util::SubscriberInitExt, fmt::writer::MakeWriterExt, layer::SubscriberExt, util::SubscriberInitExt,
}; };
use crate::consts;
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
const TRACING_LEVEL: tracing::Level = tracing::Level::DEBUG; const TRACING_LEVEL: tracing::Level = tracing::Level::DEBUG;
@ -16,7 +22,7 @@ const TRACING_LEVEL: tracing::Level = tracing::Level::INFO;
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
const TRACING_DISPLAY_THREAD: bool = false; const TRACING_DISPLAY_THREAD: bool = false;
pub fn init<P>(directory: P) pub fn init<P>(directory: P) -> WorkerGuard
where where
P: AsRef<Path>, P: AsRef<Path>,
{ {
@ -24,33 +30,30 @@ where
fs::DirBuilder::new().create(&directory).unwrap(); fs::DirBuilder::new().create(&directory).unwrap();
} }
let log_filepath = directory.as_ref().join(format!( let file_appender = RollingFileAppender::builder()
"recipes_{}.log", .rotation(Rotation::DAILY)
chrono::Local::now().format("%Y-%m-%d_%H%M%S") .filename_prefix(consts::BASE_LOG_FILENAME)
)); .filename_suffix("log")
.build(directory)
.expect("Initializing rolling file appender failed");
println!("log file: {}", log_filepath.to_str().unwrap_or_default()); let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
match std::fs::File::create(log_filepath) { let layer_file = tracing_subscriber::fmt::layer()
Ok(log_file) => { .with_writer(non_blocking.with_max_level(TRACING_LEVEL))
let layer_file = tracing_subscriber::fmt::layer() .with_ansi(false)
.with_writer(log_file.with_max_level(TRACING_LEVEL)) .with_thread_ids(TRACING_DISPLAY_THREAD)
.with_ansi(false) .with_thread_names(TRACING_DISPLAY_THREAD);
.with_thread_ids(TRACING_DISPLAY_THREAD)
.with_thread_names(TRACING_DISPLAY_THREAD);
let layer_stdout = tracing_subscriber::fmt::layer() let layer_stdout = tracing_subscriber::fmt::layer()
.with_writer(std::io::stdout.with_max_level(TRACING_LEVEL)) .with_writer(std::io::stdout.with_max_level(TRACING_LEVEL))
.with_thread_ids(TRACING_DISPLAY_THREAD) .with_thread_ids(TRACING_DISPLAY_THREAD)
.with_thread_names(TRACING_DISPLAY_THREAD); .with_thread_names(TRACING_DISPLAY_THREAD);
tracing_subscriber::Registry::default() tracing_subscriber::Registry::default()
.with(layer_file) .with(layer_file)
.with(layer_stdout) .with(layer_stdout)
.init(); .init();
}
Err(error) => { guard
println!("Unable to open log file: {}", error);
}
}
} }

View file

@ -89,13 +89,11 @@ struct Context {
dark_theme: bool, dark_theme: bool,
} }
use tracing_subscriber::{Registry, fmt::layer, layer::SubscriberExt, util::SubscriberInitExt};
// TODO: Should main returns 'Result'? // TODO: Should main returns 'Result'?
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let config = config::load(); let config = config::load();
log::init(&config.logs_directory); let _guard = log::init(&config.logs_directory);
event!(Level::INFO, "Configuration: {:?}", config); event!(Level::INFO, "Configuration: {:?}", config);