First Rust crate published!

Posted: 2018-09-05

I recently published my first crate syslog5424 which is a crate for formatting data into the syslog RFC5424 format. The crate can format any data type that implements the trait Rfc5424Data and then writes the formatted message to any type that implements Write.

The crate was made originally for slog so that there would be an easy way to get the structured logs from Rust into InfluxDB. Example: https://github.com/nocduro/slog-syslog5424#logging-to-influxdb

Here is the example from the readme:

#[derive(Debug)]
pub struct Rfc5424Message<'a> {
    pub severity: Severity,
    pub structured_data: Option<StructuredData<'a>>,
    pub message: Option<Message>,
}

impl<'a> Rfc5424Data for Rfc5424Message<'a> {
    fn severity(&self) -> Severity {
        self.severity
    }

    fn timestamp(&self) -> Option<String> {
        None
    }

    fn structured_data(&self) -> Option<StructuredData> {
        self.structured_data.clone()
    }

    fn message(&self) -> Option<Message> {
        self.message.clone()
    }
}

fn main() {
    // create the formatter struct
    let formatter = Rfc5424Builder::new("enterprise_id", Facility::User)
        .hostname("api_server_1").unwrap()
        .app_name("api").unwrap()
        .build();
    
    // create a message to be formatted
    let mut hmap: StructuredData = HashMap::new();
    hmap.insert(
        "custom",
        vec![
            ("id".into(), "54".into()),
            ("progress".into(), "complete".into()),
        ],
    );

    let msg = Rfc5424Message {
        severity: Severity::Error,
        structured_data: Some(hmap),
        message: Some(Message::Text("sample message. Hello there!".into())),
    };

    // run the formatter
    let mut out = Vec::new();
    formatter.format(&mut out, &msg).unwrap();
    println!("log: {}", String::from_utf8(out).unwrap());
}