azure-functions 0.4.1

Azure Functions for Rust
Documentation
use crate::rpc::{protocol, Sender};
use futures::{Future, Sink};
use log::{Level, Log, Metadata, Record};
use std::cell::RefCell;

thread_local!(pub static INVOCATION_ID: RefCell<String> = RefCell::new(String::new()));

pub struct Logger {
    level: Level,
    sender: Sender,
}

impl Logger {
    pub fn new(level: Level, sender: Sender) -> Logger {
        Logger { level, sender }
    }
}

impl Log for Logger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &Record) {
        if !self.enabled(record.metadata()) {
            return;
        }

        let mut event = protocol::RpcLog::new();
        event.set_level(match record.level() {
            Level::Trace => protocol::RpcLog_Level::Trace,
            Level::Debug => protocol::RpcLog_Level::Debug,
            Level::Info => protocol::RpcLog_Level::Information,
            Level::Warn => protocol::RpcLog_Level::Warning,
            Level::Error => protocol::RpcLog_Level::Error,
        });
        event.set_message(record.args().to_string());

        INVOCATION_ID.with(|id| {
            let id = id.borrow();
            if !id.is_empty() {
                event.set_invocation_id(id.clone());
            }
        });

        let mut message = protocol::StreamingMessage::new();
        message.set_rpc_log(event);
        self.sender.clone().send(message).wait().unwrap();
    }

    fn flush(&self) {}
}