Skip to main content

toe_beans/v4/
log.rs

1use tracing::level_filters::LevelFilter;
2use tracing_appender::non_blocking::{NonBlockingBuilder, WorkerGuard};
3use tracing_subscriber::{
4    EnvFilter,
5    fmt::{self, fmt},
6};
7
8/// Writes to stdout with a default level of "info" that can
9/// be changed with the `RUST_LOG` environment variable.
10///
11/// Uses a test writer and "debug" level if running unit/integration tests.
12pub fn init_logger(blocking: bool) -> Option<WorkerGuard> {
13    let is_test = cfg!(any(test, feature = "integration"));
14    let level = if is_test {
15        LevelFilter::DEBUG
16    } else {
17        LevelFilter::INFO
18    };
19    let filter = EnvFilter::builder()
20        .with_default_directive(level.into())
21        .from_env_lossy();
22    let format = fmt::format()
23        .without_time()
24        .with_ansi(false)
25        .with_target(false)
26        .compact();
27
28    let logger = fmt().event_format(format).with_env_filter(filter);
29
30    if is_test {
31        let _ = logger.with_test_writer().try_init();
32    } else {
33        if blocking {
34            let _ = logger.with_writer(std::io::stdout).try_init();
35        } else {
36            let (non_blocking, guard) = NonBlockingBuilder::default()
37                .lossy(true) // while dropping logs isn't great, the alternative is dropping requests
38                .buffered_lines_limit(200_000)
39                .finish(std::io::stdout());
40            let _ = logger.with_writer(non_blocking).try_init();
41            return Some(guard);
42        }
43    }
44
45    None
46}