irongit

Git hosting and a container registry in one Rust binary (axum + Astro)

irongit/backend/src/logging.rs
67 lines2.6 KBRust
1//! Logs go to stdout and to files under LOG_DIR (default DATA_DIR/logs):
2//! server.YYYY-MM-DD.log everything the server does, one request per line
3//! frontend.YYYY-MM-DD.log browser errors posted to /api/v1/client-logs
4//! hooks.YYYY-MM-DD.log git hook runs (pre-receive size checks)
5
6use std::path::Path;
7
8use tracing_appender::{non_blocking::WorkerGuard, rolling};
9use tracing_subscriber::{EnvFilter, Layer, filter::filter_fn, fmt, layer::SubscriberExt, util::SubscriberInitExt};
10
11pub const FRONTEND_TARGET: &str = "frontend";
12
13pub fn init(log_dir: &Path) -> anyhow::Result<Vec<WorkerGuard>> {
14 std::fs::create_dir_all(log_dir)?;
15 let server_appender = rolling::Builder::new()
16 .rotation(rolling::Rotation::DAILY)
17 .filename_prefix("server")
18 .filename_suffix("log")
19 .max_log_files(14)
20 .build(log_dir)?;
21 let frontend_appender = rolling::Builder::new()
22 .rotation(rolling::Rotation::DAILY)
23 .filename_prefix("frontend")
24 .filename_suffix("log")
25 .max_log_files(14)
26 .build(log_dir)?;
27 let (server_writer, server_guard) = tracing_appender::non_blocking(server_appender);
28 let (frontend_writer, frontend_guard) = tracing_appender::non_blocking(frontend_appender);
29
30 let filter = || EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info,sqlx=warn,russh=warn,tower_http=info"));
31
32 tracing_subscriber::registry()
33 .with(fmt::layer().with_target(true).with_filter(filter()))
34 .with(
35 fmt::layer()
36 .with_ansi(false)
37 .with_writer(server_writer)
38 .with_filter(filter())
39 .with_filter(filter_fn(|meta| meta.target() != FRONTEND_TARGET)),
40 )
41 .with(
42 fmt::layer()
43 .with_ansi(false)
44 .with_target(false)
45 .with_writer(frontend_writer)
46 .with_filter(filter_fn(|meta| meta.target() == FRONTEND_TARGET)),
47 )
48 .init();
49 Ok(vec![server_guard, frontend_guard])
50}
51
52/// Hooks run as short-lived child processes; they append to their own file.
53pub fn init_hook(log_dir: &Path) -> Option<WorkerGuard> {
54 std::fs::create_dir_all(log_dir).ok()?;
55 let appender = rolling::Builder::new()
56 .rotation(rolling::Rotation::DAILY)
57 .filename_prefix("hooks")
58 .filename_suffix("log")
59 .max_log_files(14)
60 .build(log_dir)
61 .ok()?;
62 let (writer, guard) = tracing_appender::non_blocking(appender);
63 tracing_subscriber::registry()
64 .with(fmt::layer().with_ansi(false).with_writer(writer).with_filter(EnvFilter::new("info")))
65 .init();
66 Some(guard)
67}