diff --git a/crates/shturman-common/src/lib.rs b/crates/shturman-common/src/lib.rs index 4cb5b97..96caa1d 100644 --- a/crates/shturman-common/src/lib.rs +++ b/crates/shturman-common/src/lib.rs @@ -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; diff --git a/crates/shturman-common/src/log.rs b/crates/shturman-common/src/log.rs index 36c2eef..4151161 100644 --- a/crates/shturman-common/src/log.rs +++ b/crates/shturman-common/src/log.rs @@ -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"); + } +}