sidevm_logger/
lib.rs

1//! Logger for sidevm programs.
2
3use log::{LevelFilter, Log, Metadata, Record};
4use sidevm_env::ocall_funcs_guest as ocall;
5
6/// A logger working inside a Sidevm.
7pub struct Logger {
8    max_level: LevelFilter,
9}
10
11impl Logger {
12    /// Create a new logger with the given maximum level.
13    pub fn with_max_level(max_level: LevelFilter) -> Self {
14        Self { max_level }
15    }
16
17    /// Install the logger as the global logger.
18    pub fn init(self) {
19        log::set_max_level(self.max_level);
20        log::set_boxed_logger(Box::new(self)).unwrap();
21    }
22}
23
24impl Log for Logger {
25    fn enabled(&self, metadata: &Metadata) -> bool {
26        metadata.level() <= self.max_level
27    }
28
29    fn log(&self, record: &Record) {
30        if self.enabled(record.metadata()) {
31            let message = format!("{}", record.args());
32
33            let _ = ocall::log(record.level(), &message);
34        }
35    }
36
37    fn flush(&self) {}
38}