1use tracing::level_filters::LevelFilter;
2use tracing_appender::non_blocking::{NonBlockingBuilder, WorkerGuard};
3use tracing_subscriber::{
4 EnvFilter,
5 fmt::{self, fmt},
6};
7
8pub 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) .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}