stackdriver_logging_utils/
lib.rs1extern 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
45pub 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}