rsiot/logging/
target_x86_64.rs

1use std::env;
2
3use tokio::spawn;
4use tracing::info;
5use tracing_subscriber::{
6    fmt::Layer, layer::SubscriberExt, registry, util::SubscriberInitExt, EnvFilter,
7};
8
9/// Настройка логгирования
10///
11/// Логгирование настраивается через входной параметр `rust_log`.
12///
13/// Логи выводятся в:
14/// - stdout
15/// - Grafana Loki
16pub async fn configure_logging(rust_log: &str, loki_url: Option<&str>) -> super::Result<()> {
17    let service = env::args().collect::<Vec<String>>()[0].clone();
18    let service = service_cleanup(&service);
19
20    // архивируем в консоль
21    let layer_stdout = Layer::new().pretty();
22
23    // архивируем в Loki
24    let layer_loki = match loki_url {
25        Some(loki_url) => {
26            let loki_url = url::Url::parse(loki_url)?;
27
28            let (layer_loki, task_loki) = tracing_loki::builder()
29                .label("service", service.clone())?
30                .build_url(loki_url.clone())?;
31
32            spawn(task_loki);
33
34            Some(layer_loki)
35        }
36        None => None,
37    };
38
39    // фильтруем на основе значения переменной RUST_LOG
40    let filter = EnvFilter::new(rust_log);
41
42    registry()
43        .with(layer_loki)
44        .with(layer_stdout)
45        .with(filter)
46        .init();
47
48    info!("service {} started", service);
49    Ok(())
50}
51
52/// Удалить путь из названия файла
53fn service_cleanup(input: &str) -> String {
54    input.split('/').last().unwrap().to_owned()
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test1() {
63        assert_eq!("service", service_cleanup("./service"));
64        assert_eq!("service", service_cleanup("../dir/service"));
65        assert_eq!("service", service_cleanup("service"));
66        assert_eq!("", service_cleanup(""));
67    }
68}