2011-12-07 9 views
22

मेरे पास sinks::text_file_backend सिंक है। मैं पहले से ही कुछ घुमाया लॉग फाइल है कहते हैं:Boost.Log - घूर्णन फ़ाइलों को जोड़ने के लिए टेक्स्ट सिंक बैकएंड को कॉन्फ़िगर कैसे करें

myLog001.log, myLog002.log और इतने

पर मैं सिंक पिछले घुमाया फ़ाइल के लिए लिख रखना चाहते हैं - myLog002.log, उसकी सामग्री को संलग्न और वहां से रोटेशन जारी रखें।

मैंने केवल keywords::open_mode = append खोजने में कामयाब रहा है, लेकिन यह केवल मौजूदा myLogX फ़ाइलों के शीर्ष पर संलग्न है, जिससे उन्हें बड़ा और निश्चित रूप से पढ़ने में बहुत मुश्किल होती है।

क्या यह Boost.Log में किया जा सकता है?

उत्तर

14

कार्यक्षमता पाठ सिंक करने के लिए बनाया गया है यही कारण है, और the documentation निश्चित आकार और समय पर घूर्णन के लिए फ़ाइल-नाम पैटर्न और नियम तय करने के लिए एक उदाहरण में शामिल हैं:

// The function registers file sink in the logging library 
void init_logging() 
{ 
    boost::shared_ptr<logging::core> core = logging::core::get(); 

    boost::shared_ptr<sinks::text_file_backend> backend = 
     boost::make_shared<sinks::text_file_backend>(
      // file name pattern 
      keywords::file_name = "file_%5N.log", 
      // rotate the file upon reaching 5 MiB size... 
      keywords::rotation_size = 5 * 1024 * 1024, 
      // ...or at noon, whichever comes first 
      keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0) 
     ); 

    // Wrap it into the frontend and register in the core. 
    // The backend requires synchronization in the frontend. 
    typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
    boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

    core->add_sink(sink); 
} 

बनाने के लिए जाहिरा तौर पर कोई तरीका नहीं है लाइब्रेरी इस सेटअप के साथ मौजूदा फाइलों में संलग्न है। को sink बनाने से पहले, जैसा कि दस्तावेज़ में "घुमावदार फाइलों का प्रबंधन" शीर्षक के तहत दिखाया गया है, लेकिन यह केवल लाइब्रेरी को क्लीनअप के कारण होने से पहले पिछले लॉग को ओवरराइट करने से रोकता है।

जब यह विषय फरवरी 2013 में विकास मेलिंग सूची पर उभरा, पुस्तकालय के लेखक ने बताया कि adding support for appending would be a nontrivial change जो वर्तमान डिज़ाइन के तहत नहीं बनाया जा सका।

+0

मैं backend- का उपयोग>();:

आप निम्नलिखित मानकों के साथ उदाहरण text_file_backend बना सकते हैं मेरे कार्यक्रम में, लेकिन इस कोड में चलाने पर प्रोग्राम क्रैश हो गया। इस बारे में कोई विचार है? –

+0

रोटेशन काम करता है, लेकिन जोड़ने के बारे में क्या? कार्यक्रम के बाद के प्रत्येक भाग के लिए, जब तक लॉग फ़ाइल रोटेशन सीमा तक नहीं पहुंच जाती है, तब तक एक कार्यक्रम को अंतिम लॉग में जोड़ना चाहिए। यह कोड प्रत्येक रन पर एक नई लॉग फ़ाइल बनाता है, और 'scan_for_files' जोड़ना कोई प्रभाव नहीं पड़ता है। – ixe013

+0

आप सही हैं, @ Ixe013। मैंने अपना जवाब संशोधित कर दिया है। –

1

आपको टेक्स्ट फ़ाइल का उपयोग करने से पहले open_mode निर्दिष्ट करना होगा। डिफ़ॉल्ट रूप से Boost.Log std :: ios_base :: trunc | std :: ios_base :: ओपन मोड के रूप में उपयोग करेगा जो स्पष्ट रूप से पुरानी लॉग फ़ाइल को छोटा कर देगा। scan_for_files

{ 
     boost::shared_ptr<sinks::text_file_backend> backend = 
      boost::make_shared<sinks::text_file_backend>(
       keywords::file_name = logger_file_path, 
       keywords::open_mode = std::ios_base::app|std::ios_base::out, 
       keywords::rotation_size = 5 * 1024 * 1024, 
       keywords::time_based_rotation = sinks::file::rotation_at_time_point(12, 0, 0)); 
     // Wrap it into the frontend and register in the core. 
     // The backend requires synchronization in the frontend. 
     typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; 
     boost::shared_ptr<sink_t> sink(new sink_t(backend)); 
     sink->set_formatter(logFmt); 
     core->add_sink(sink); 
    } 
संबंधित मुद्दे