我正在尝试使用日志包并自己实现一个记录器。我称之为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
永远不会被调用,我不明白为什么。
答案 0 :(得分:7)
记录器实现被提供给日志库和is effectively leaked。这允许实现行为它具有'static
生命周期,让它在许多地方使用。
如果您确实需要它,可以在程序结束时关闭记录器:
fn main() {
mylog::init().unwrap();
info!("My info message");
log::shutdown_logger();
}