2016-09-06 7 views
7

मैं लॉग क्रेट का उपयोग करने और खुद को लॉगर लागू करने का प्रयास कर रहा हूं। मैं इसे 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 कभी नहीं कहा जाता है और मैं क्यों समझ में नहीं आता।

उत्तर

7

लॉगर कार्यान्वयन लॉगिंग लाइब्रेरी और is effectively leaked पर दिया गया है। यह कार्यान्वयन को पर कार्य करने की अनुमति देता है जैसे कि में 'static जीवनकाल है, इसे कई स्थानों पर उपयोग करने दें।

तुम सच में इसकी जरूरत है, तो आप नीचे लकड़हारा कार्यक्रम के अंत में बंद कर सकते हैं:

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

नोट: मैं इस कॉल तो इस पर ध्यान देने के लिए चला गया के धागे की सुरक्षा के बारे में उत्सुक था; जो मैं समझता हूं, कार्यान्वयन से यह पता चलता है कि वर्तमान में कितने धागे लॉगिंग कर रहे हैं और 'shutdown_logger' कॉल पर "ब्लॉक" करेंगे जब तक कि सभी नहीं किए जाते। –

+0

@ मैथ्यूयूएम। हाँ, मैं ट्रांसम्यूट और अंतर्निहित परमाणुओं के कार्यान्वयन पर हैरान था। – Shepmaster

+0

अगर मैं इसे स्वयं कहता हूं तो यह मदद करता है। लेकिन मुझे कुछ त्रुटि या मारे जाने के साथ प्रोग्राम समाप्त होने पर पकड़ने की ज़रूरत है। या मुझे पैनिक कैचर [लिंक] (https://github.com/sfackler/rust-log-panics/blob/master/src/lib.rs) का उपयोग करने की आवश्यकता है? –

संबंधित मुद्दे