rivet_logger/processors/
hostname.rs1use std::process::Command;
2use std::sync::OnceLock;
3
4use crate::logger::{BoxError, LogRecord, LogValue, Processor};
5
6static HOSTNAME_CACHE: OnceLock<String> = OnceLock::new();
7
8#[derive(Default)]
9pub struct Hostname;
10
11impl Processor for Hostname {
12 fn process(&self, mut record: LogRecord) -> Result<LogRecord, BoxError> {
13 let hostname = HOSTNAME_CACHE.get_or_init(resolve_hostname).clone();
14 record
15 .extra
16 .insert("hostname".to_string(), LogValue::String(hostname));
17 Ok(record)
18 }
19}
20
21fn resolve_hostname() -> String {
22 if let Some(hostname) = std::env::var("HOSTNAME")
23 .ok()
24 .filter(|value| !value.trim().is_empty())
25 {
26 return hostname;
27 }
28
29 let output = Command::new("hostname").output();
30 let Ok(output) = output else {
31 return String::new();
32 };
33 if !output.status.success() {
34 return String::new();
35 }
36
37 String::from_utf8_lossy(&output.stdout).trim().to_string()
38}