stackdriver_logging_utils/
lib.rs

1extern crate fern;
2extern crate log;
3extern crate serde;
4#[macro_use]
5extern crate serde_derive;
6extern crate serde_json;
7
8use std::fmt::Arguments;
9
10use log::{Level, Record};
11
12fn map_level_to_stackdriver_string(level: Level) -> &'static str {
13    match level {
14        Level::Error => "ERROR",
15        Level::Warn => "WARNING",
16        Level::Info => "INFO",
17        Level::Debug => "DEBUG",
18        Level::Trace => "DEBUG",
19    }
20}
21
22impl<'a, 'b> From<(&'b Arguments<'a>, &'b Record<'a>)> for StackdriverLogLine {
23    fn from((args, record): (&'b Arguments<'a>, &'b Record<'a>)) -> Self {
24        StackdriverLogLine {
25            severity: Some(map_level_to_stackdriver_string(record.level()).into()),
26            message: format!("{}", args),
27            file: record.file().map(String::from),
28            line: record.line(),
29            module_path: record.module_path().map(String::from),
30            target: Some(record.target().into()),
31        }
32    }
33}
34
35#[derive(Serialize)]
36pub struct StackdriverLogLine {
37    severity: Option<String>,
38    message: String,
39    file: Option<String>,
40    line: Option<u32>,
41    module_path: Option<String>,
42    target: Option<String>,
43}
44
45// Stolen from https://github.com/FatWhaleCorp/bookkeeper/blob/ee40830ef8fc79ca1c458811de55a74b5ab00a35/src/main.rs#L25-L40
46pub fn init_default_logger() {
47    fern::Dispatch::new()
48        .format(|out, message, record| {
49            let stackdriver_log_line = StackdriverLogLine::from((message, record));
50            out.finish(format_args!(
51                "{}",
52                serde_json::to_string(&stackdriver_log_line).unwrap()
53            ))
54        })
55        .level(log::LevelFilter::Debug)
56        .level_for("hyper", log::LevelFilter::Info)
57        .level_for("mio", log::LevelFilter::Info)
58        .level_for("tokio_core", log::LevelFilter::Info)
59        .level_for("tokio_reactor", log::LevelFilter::Info)
60        .chain(std::io::stdout())
61        .apply()
62        .unwrap();
63}