rsiot/logging/
target_x86_64.rs1use std::env;
2
3use tokio::spawn;
4use tracing::info;
5use tracing_subscriber::{
6 fmt::Layer, layer::SubscriberExt, registry, util::SubscriberInitExt, EnvFilter,
7};
8
9pub 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 let layer_stdout = Layer::new().pretty();
22
23 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 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
52fn 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}