Skip to main content

actix_cloud_extra/
logger.rs

1use std::path::PathBuf;
2
3use actix_cloud::{
4    logger::{LogItem, Logger, LoggerBuilder, LoggerGuard},
5    tracing::Level,
6};
7
8fn transformer(mut item: LogItem) -> LogItem {
9    // Trim target path.
10    // Only keep the first path before `::`. Change several library targets to our own.
11    item.target = item
12        .target
13        .split("::")
14        .next()
15        .unwrap_or("unknown")
16        .to_owned();
17
18    // Remove useless file path.
19    // Only keep path starting from the last `src`.
20    if let Some(filename) = &item.filename {
21        let mut buf = Vec::new();
22        let s = PathBuf::from(filename);
23        for i in s.iter().rev() {
24            buf.push(i);
25            if i.eq_ignore_ascii_case("src") {
26                break;
27            }
28        }
29        let mut s = PathBuf::new();
30        for i in buf.into_iter().rev() {
31            s.push(i);
32        }
33        item.filename = Some(s.to_string_lossy().into());
34    }
35    item
36}
37
38pub fn start_logger(
39    enable: bool,
40    json: bool,
41    verbose: bool,
42    filter: fn(item: &LogItem) -> bool,
43) -> (Option<Logger>, Option<LoggerGuard>) {
44    if enable {
45        let mut builder = LoggerBuilder::new();
46        if json {
47            builder = builder.json();
48        }
49        if verbose {
50            builder = builder.filename().line_number().level(Level::DEBUG);
51        }
52        builder = builder.transformer(transformer).filter(filter);
53        let (logger, guard) = builder.start();
54        (Some(logger), Some(guard))
55    } else {
56        (None, None)
57    }
58}