feat(common): init_tracing -> journald (A10) + re-exports

journald на Linux, stderr-fallback иначе (cfg-gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 11:56:52 +03:00
parent 70045e2544
commit e8576a0196
2 changed files with 44 additions and 2 deletions
+4 -1
View File
@@ -6,4 +6,7 @@ pub mod clock;
pub mod log;
pub mod paths;
// re-export для эргономики добавляется в Task 5, когда все символы определены.
pub use atomic::{tmp_path, write_atomic};
pub use clock::monotonic_secs;
pub use log::init_tracing;
pub use paths::Layout;
+40 -1
View File
@@ -1 +1,40 @@
//! Инициализация логирования — A10 (наполняется в Task 5).
//! Инициализация логирования — A10: `tracing` → journald (Linux) / stderr-fallback (dev на macOS / нет демона).
//! Политика volatile / rate-limit — на стороне journald (настраивается в Плане 5).
use tracing_subscriber::prelude::*;
use tracing_subscriber::EnvFilter;
/// Идемпотентно (повторный вызов проглатывается `try_init`). Уровень — из `RUST_LOG`, дефолт `info`.
pub fn init_tracing(service: &str) {
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
#[cfg(target_os = "linux")]
{
if let Ok(layer) = tracing_journald::layer() {
let _ = tracing_subscriber::registry()
.with(filter)
.with(layer.with_syslog_identifier(service.to_string()))
.try_init();
return;
}
}
// fallback: stderr (non-Linux или journald недоступен)
let _ = service;
let _ = tracing_subscriber::registry()
.with(filter)
.with(tracing_subscriber::fmt::layer())
.try_init();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn init_does_not_panic() {
// глобальный subscriber ставится один раз; повторный вызов безопасен (try_init)
init_tracing("shturman-test");
tracing::info!("smoke");
}
}