为什么不调用 drop 来实现记录器?

Why is drop not called for a logger implementation?

我正在尝试使用日志箱并自己实现一个记录器。我称之为 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 从未被调用过,我不明白为什么。

记录器实现已提供给日志库和 is effectively leaked。这允许实现 就像 它具有 'static 生命周期一样,让它可以在许多地方使用。

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

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