为什么不调用drop实现logger?

时间:2016-09-06 14:00:46

标签: logging rust destructor

我正在尝试使用日志包并自己实现一个记录器。我称之为mylog

extern crate log;
use log::*;

struct Mylog;

impl log::Log for Mylog {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= LogLevel::Info
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            println!("hello log");
        }
    }
}
impl Drop for Mylog {
    fn drop(&mut self) {
        println!("dropped"); // This is never called, why?
    }
}
pub fn init() -> Result<(), SetLoggerError> {
    log::set_logger(|max_log_level| {
        max_log_level.set(LogLevelFilter::Info);
        Box::new(Mylog)
    })
}

在main.rs中:

extern crate mylog;
#[macro_use] extern crate log;

fn main() {
    mylog::init().unwrap();
    info!("My info message");
}

Drop永远不会被调用,我不明白为什么。

1 个答案:

答案 0 :(得分:7)

记录器实现被提供给日志库和is effectively leaked。这允许实现行为它具有'static生命周期,让它在许多地方使用。

如果您确实需要它,可以在程序结束时关闭记录器:

fn main() {
    mylog::init().unwrap();
    info!("My info message");
    log::shutdown_logger();
}