Skip to main content

static_web_server/
logger.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// This file is part of Static Web Server.
3// See https://static-web-server.net/ for more information
4// Copyright (C) 2019-present Jose Quintana <joseluisq.net>
5
6//! Provides logging initialization for the web server.
7//!
8
9use tracing::Level;
10use tracing_subscriber::{
11    filter::Targets,
12    fmt::{format::FmtSpan, time},
13    prelude::*,
14};
15
16use crate::{Context, Result};
17
18/// Logging system initialization
19pub fn init(log_level: &str, log_with_ansi: bool) -> Result {
20    let log_level = log_level.to_lowercase();
21
22    configure(&log_level, log_with_ansi).with_context(|| "failed to initialize logging")?;
23
24    Ok(())
25}
26
27/// Initialize logging builder with its levels.
28fn configure(level: &str, enable_ansi: bool) -> Result {
29    let level = level
30        .parse::<Level>()
31        .with_context(|| "failed to parse log level")?;
32
33    let filtered_layer = tracing_subscriber::fmt::layer()
34        .with_writer(std::io::stderr)
35        .with_span_events(FmtSpan::CLOSE)
36        .with_ansi(enable_ansi)
37        .with_timer(time::LocalTime::rfc_3339())
38        .with_filter(Targets::default().with_default(level));
39
40    match tracing_subscriber::registry()
41        .with(filtered_layer)
42        .try_init()
43    {
44        Err(err) => Err(anyhow!(err)),
45        _ => Ok(()),
46    }
47}