diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..07456fc --- /dev/null +++ b/src/main.rs @@ -0,0 +1,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(), + ); +} |