c++ - Boost.Log-घुमावदार फ़ाइलों में जोड़ने के लिए एक पाठ सिंक बैकएंड को कॉन्फ़िगर कैसे करें




logging boost-log (2)

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

आप निम्न पैरामीटर के साथ text_file_backend उदाहरण बना सकते हैं:

    {
        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);
    }

मेरे पास एक sinks::text_file_backend सिंक है। मान लें कि मेरे पास पहले से ही कुछ घुमावदार लॉग फाइलें हैं:

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

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

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

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


वह कार्यक्षमता टेक्स्ट सिंक में बनाई गई है, और दस्तावेज़ में कुछ आकार और समय पर घूर्णन के लिए फ़ाइल-नाम पैटर्न और नियम सेट करने के लिए एक उदाहरण शामिल है:

// 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);
}

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

जब यह विषय फरवरी 2013 में विकास मेलिंग सूची पर उभरा, पुस्तकालय के लेखक ने समझाया कि संलग्न करने के लिए समर्थन जोड़ना एक अनौपचारिक परिवर्तन होगा जो वर्तमान डिजाइन के तहत नहीं बनाया जा सकता है।





boost-log