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(),
);
}
|