c++ - बूस्ट लॉग तुच्छ उपयोग में रिसाव से बचें




logging boost (2)

बूस्ट लॉग - कई अन्य लॉगिंग पुस्तकालयों की तरह - आंतरिक रूप से Tls का उपयोग करता है यह एक कठिन प्रक्रिया है (और यह कभी-कभी असंभव लगता है) जब एक धागा समाप्त होता है तो Tls चर को साफ करने के लिए एक लॉगिंग सिस्टम के लिए। बूस्ट को एक ही कठिनाइयों का सामना करना पड़ता है

लॉगिंग कोड वाले लंबे समय से चलने वाले एप्लिकेशन के लिए, कई थ्रेडों को अलग करना और उनका कार्य समाप्त होने पर उन्हें समाप्त करना एक अच्छा उपयोग नहीं है भारी मल्टीटास्किंग सिस्टम में एक बेहतर दृष्टिकोण प्रत्येक थ्रेड को प्रत्येक बार खींचने के बजाय थ्रेड-पूल का उपयोग करना है।

मैंने एक थ्रेड पूल का इस्तेमाल करने के लिए आवेदन बदल दिया और सवाल में लीक गायब हो गए हैं। टीएलएस वैरिएबल अभी भी हैं, लेकिन अब से थ्रेड्स का पुन: उपयोग किया जा रहा है इसलिए उनके संबंधित थ्रेड्स द्वारा रीसेट किए गए हैं।

मुझे एक सर्वर साइड एप्लिकेशन से वालग्रिंड रिसाव रिपोर्ट मिल रही है जो बूटलॉग का उपयोग करता है जिसे 1.56 को बढ़ाकर वितरित किया गया है। valgrind रिपोर्ट है:

== 8021 == 1,15 9 ब्लॉक में 37,088 बाइट निश्चित तौर पर नुकसान के रिकॉर्ड में खो चुके हैं 1,643 के 1,613

== 8021 == पर 0x4A05588: memalign (vg_replace_malloc.c: 727)

== 8021 == 0x3FDA61118F: tls_get_addr_tail (/lib64/ld-2.12.so में)

== 8021 == 0x3FDA61165F: __tls_get_addr (/lib64/ld-2.12.so में)

== 8021 == 0x3FE6ABBDCB: __cxa_get_globals (/usr/lib64/libstdc++.so.6.0.13 में)

== 8021 == द्वारा 0x730C528: बढ़ावा :: लॉग :: v2_mt_posix :: aux :: unhandled_exception_count () (/opt/sesteksdk/lib/libboost_log.so.1.56.0 में)

== 8021 == 0x5D54D1F द्वारा: sestek :: mrcp :: ऑडियो :: मान्यता :: एसिंक्रोनसरायककर्ता :: नोटिफ़ाइन (sestek :: voice :: मान्यता :: आईआरसीओकेनिजरनोटिफिकेशन कंसोर्ट) * (रिकार्ड_ओस्ट्रीम। एचपी: 25 9)

यह रिसाव एक पंक्ति से सरल रूप से आ रहा है:
LOGGER(debug)<< _chanProp->GetId() << " got recognition ended notification from recognizer";

हमें एक एकल, अल्पावधि परीक्षण चलाने से ही इनमें से 5 लीक प्राप्त होते हैं।

हम पाठ फ़ाइल बैकएंड का उपयोग करते हैं, सिंक्रोनस सिंक के साथ, ऑटो फ्लश चालू है मूल रूप से:

void InitializeFileLog(const std::string & logDir)
    {   
        boost::shared_ptr< logging::core > loggingCore = logging::core::get();


        loggingCore->add_global_attribute("TimeStamp", attrs::local_clock());

        string logPath = logDir + "/gvzmrcpsr_%N.txt";

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

        backend->auto_flush(true);

        // 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 = boost::make_shared< sink_t>(backend);

        loggingCore->add_sink(sink);


        sink->flush();
        sink->set_formatter
            (
            expr::stream
            << expr::attr< boost::posix_time::ptime >("TimeStamp")
            << " : [" << expr::attr< sestek::log::LogLevel >("Severity")
            << "] " << expr::smessage
            );

        backend->set_file_collector(sinks::file::make_collector(
            // rotated logs will be moved here
            keywords::target = logDir + "/old_mrcpsr_plugin_logs",
            // oldest log files will be removed if the total size reaches 100 MiB...
            keywords::max_size = 100 * 1024 * 1024,
            // ...or the free space in the target directory comes down to 50 MiB
            keywords::min_free_space = 50 * 1024 * 1024
        ));

        try
        {
            backend->scan_for_files(sinks::file::scan_all);
        }
        catch(std::exception & )
        {
            //LOGGER(sestek::log::fatal) << "exception during scanning : " << e.what();

        }

    }

सिस्टम संकलित और centto 6.6 पर devtoolkit2.0 का उपयोग कर चलाया जाता है। जीसीसी संस्करण 4.8.2 है।

तो क्या हमारे बूस्ट लॉग के उपयोग में कोई समस्या है? या क्या बूस्ट लॉग वास्तव में ऐसी समस्या है (एस) मुझे लगता है कि हमारे उपयोग को एक तुच्छ के रूप में माना जा सकता है, हम सिर्फ स्टार्ट-अप के दौरान ऊपर दिए गए कॉन्फ़िगरेशन कोड को चलाते हैं।

नोट: भले ही एक लीक का आकार काफी छोटा हो, हमारे सॉफ़्टवेयर को एक सर्वर पर एक सेवा के रूप में चलाया जाता है, इसलिए इस तरह की दोहराव रिसाव हमारे लिए समस्याग्रस्त है।


मुझे वास्तव में सवाल नहीं मिलता। आप एक रिसाव के प्रमाण दिखाते हैं, और पूछते हैं "यह लीक करता है" सही है। यह शायद ही आश्चर्य की बात है लॉगर्स थ्रेड स्थानीय "सिंग्लटोन" का उपयोग करते हैं आपके धागे को व्यवस्थित करने के आधार पर, उन कमियों को ठीक से आंसू करने के लिए संभव / आसन्न असंभव होगा।

एक SSCCE बनाने और उचित शटडाउन अनुक्रमों पर दस्तावेज को हिट करने का समय।

ध्यान दें

लॉगर्स का शट डाउन बेहद कठिन है आपको बंद मौके से निपटने की ज़रूरत है कि शटडाउन (एक डिज़ाइन गंध) के दौरान कुछ की आवश्यकता होती है; इससे भी बदतर, अलग सिंक एक दूसरे पर निर्भर हो सकता है और किसी विशेष क्रम में बंद होने से रोक सकता है)।

बहुत सारे ढांचे को ओएस में सफाई के लिए छोड़ दें।

PS कुछ भी दोहराए जाने वाले रिसाव को इंगित नहीं करता, क्योंकि यह रिसाव प्रति-थ्रेड जैसा दिखता है।





boost-log