aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 07456fc68b48cb953e4d27e2064baea7182df893 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use clap::Parser;
use log::Log;
use opentelemetry_appender_log::OpenTelemetryLogBridge;
use opentelemetry_sdk::logs::{Logger, LoggerProvider};
use runit_otel::Opentelemetry;
use std::io::stdin;

#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct VloggerArgs {
    #[arg(long, default_value = "vlogger")]
    mode: String,
    #[arg(index = 1, default_value = "")]
    tag: String,
    #[arg(index = 2, default_value = "info")]
    level: String,
    #[arg(index = 3, default_value = "daemon")]
    facility: String,
}

#[tokio::main]
async fn main() {
    let args = VloggerArgs::parse();
    let mut manager = Opentelemetry::new();
    let logger = manager.init_log().unwrap();
    if args.mode == "vlogger" {
        let tag = args.tag;
        let level = args.level;
        let facility = args.facility;

        let service_name: String;
        if tag.trim().is_empty() {
            service_name = facility.clone();
        } else {
            service_name = tag;
        }
        let lev = string_to_level(&level);
        let lines = stdin().lines();
        for line in lines {
            match line {
                Ok(text) => {
                    print_line(&logger, &text, &service_name, lev, &facility);
                }
                Err(err) => {
                    println!("Debug error here: {0}", err);
                }
            };
        }
    }

    drop(manager);
}

fn string_to_level(level: &str) -> log::Level {
    match level {
        "debug" => log::Level::Debug,
        "info" | "notice" => log::Level::Info,
        "warning" | "warn" => log::Level::Warn,
        "emerg" | "alert" | "crit" | "panic" | "error" | "err" => log::Level::Error,
        _ => log::Level::Debug,
    }
}

fn print_line(
    logger: &OpenTelemetryLogBridge<LoggerProvider, Logger>,
    text: &str,
    tag: &str,
    level: log::Level,
    facility: &str,
) {
    logger.log(
        &log::RecordBuilder::new()
            .key_values(&[("service.name", facility), ("service.namespace", tag)])
            .level(level)
            .args(format_args!("{}", text))
            .build(),
    );
}