aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs78
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(),
+ );
+}