azure_functions/
logger.rs

1use crate::{
2    rpc::{rpc_log, streaming_message::Content, RpcLog, StreamingMessage},
3    worker::Sender,
4};
5use log::{Level, Log, Metadata, Record};
6
7pub struct Logger {
8    level: Level,
9    sender: Sender,
10}
11
12impl Logger {
13    pub fn new(level: Level, sender: Sender) -> Logger {
14        Logger { level, sender }
15    }
16}
17
18impl Log for Logger {
19    fn enabled(&self, metadata: &Metadata) -> bool {
20        metadata.level() <= self.level
21    }
22
23    fn log(&self, record: &Record) {
24        if !self.enabled(record.metadata()) {
25            return;
26        }
27
28        let mut event = RpcLog {
29            level: match record.level() {
30                Level::Trace => rpc_log::Level::Trace,
31                Level::Debug => rpc_log::Level::Debug,
32                Level::Info => rpc_log::Level::Information,
33                Level::Warn => rpc_log::Level::Warning,
34                Level::Error => rpc_log::Level::Error,
35            } as i32,
36            message: record.args().to_string(),
37            ..Default::default()
38        };
39
40        event.invocation_id = crate::context::CURRENT.with(|c| c.borrow().invocation_id.clone());
41
42        self.sender
43            .unbounded_send(StreamingMessage {
44                content: Some(Content::RpcLog(event)),
45                ..Default::default()
46            })
47            .unwrap_or(());
48    }
49
50    fn flush(&self) {}
51}