मैं लॉग क्रेट का उपयोग करने और खुद को लॉगर लागू करने का प्रयास कर रहा हूं। मैं इसे 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
कभी नहीं कहा जाता है और मैं क्यों समझ में नहीं आता।
नोट: मैं इस कॉल तो इस पर ध्यान देने के लिए चला गया के धागे की सुरक्षा के बारे में उत्सुक था; जो मैं समझता हूं, कार्यान्वयन से यह पता चलता है कि वर्तमान में कितने धागे लॉगिंग कर रहे हैं और 'shutdown_logger' कॉल पर "ब्लॉक" करेंगे जब तक कि सभी नहीं किए जाते। –
@ मैथ्यूयूएम। हाँ, मैं ट्रांसम्यूट और अंतर्निहित परमाणुओं के कार्यान्वयन पर हैरान था। – Shepmaster
अगर मैं इसे स्वयं कहता हूं तो यह मदद करता है। लेकिन मुझे कुछ त्रुटि या मारे जाने के साथ प्रोग्राम समाप्त होने पर पकड़ने की ज़रूरत है। या मुझे पैनिक कैचर [लिंक] (https://github.com/sfackler/rust-log-panics/blob/master/src/lib.rs) का उपयोग करने की आवश्यकता है? –