simple/
simple.rs

1use std::env;
2
3use gelf_logger::{
4    gelf_alert, gelf_critical, gelf_debug, gelf_emergency, gelf_error, gelf_info, gelf_log,
5    gelf_notice, gelf_warn, Builder, GelfLevel, Value,
6};
7use log::{error, info, warn};
8use serde::Serialize;
9
10fn main() {
11    // Init logger.
12    let mut builder = Builder::new()
13        .parse_filters("debug")
14        .extend_additional_fields([(
15            "instance".to_owned(),
16            Value::String("instance-1".to_owned()),
17        )]);
18    builder = match env::args().nth(1).unwrap_or("stderr".to_owned()).as_str() {
19        "stdout" => builder.stdout(),
20        "stderr" => builder.stderr(),
21        endpoint => {
22            let (hostname, port) = endpoint.split_once(':').expect("invalid tcp endpoint");
23            builder
24                .hostname(hostname.to_owned())
25                .port(port.parse().expect("invalid port"))
26        }
27    };
28    builder.init();
29
30    // Basic kv logs.
31    info!(count = 5; "packet received");
32    warn!(user = "foo"; "unknown user");
33    error!(err:err = "abc".parse::<u32>().unwrap_err(); "parse error");
34
35    let req = Request {
36        id: 42,
37        method: "GET",
38        path: "/login",
39    };
40    // Will serialize as a `Debug` string.
41    info!(req:?; "incoming request");
42    // Will flatten all the field and add them as additional fields.
43    info!(req:serde; "incoming request");
44
45    // Gelf specific levels.
46    gelf_log!(GelfLevel::Emergency, foo = "bar"; "an emergency log");
47    gelf_emergency!(foo = "bar"; "an emergency log");
48    gelf_alert!(foo = "bar"; "an alert log");
49    gelf_critical!(foo = "bar"; "a critical log");
50    gelf_error!(foo = "bar"; "an error log");
51    gelf_warn!(foo = "bar"; "a warn log");
52    gelf_notice!(foo = "bar"; "a notice log");
53    gelf_info!(foo = "bar"; "an info log");
54    gelf_debug!(foo = "bar"; "a debug log");
55
56    // Flush underlying TCP socket.
57    // This will only flush. The socket may be dropped without proper closing.
58    log::logger().flush();
59}
60
61#[derive(Serialize, Debug)]
62struct Request<'a> {
63    id: u16,
64    method: &'a str,
65    path: &'a str,
66}