C++ अनुप्रयोगों की निगरानी और लॉगिंग: अराजकता से व्यवस्था तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका C++ एप्लिकेशन एक ब्लैक बॉक्स है? इसे ठीक करने का समय आ गया है!

\n\n

एक स्थिति की कल्पना करें: आपने एक उच्च-लोड वाली C++ सेवा शुरू की, सब कुछ बढ़िया काम कर रहा है। एक सप्ताह बीतता है, दूसरा - और अचानक उपयोगकर्ता धीमी गति की शिकायत करते हैं। आप कोड में जाते हैं, महत्वपूर्ण स्थानों पर std::cout लगाते हैं, पुनः संकलित करते हैं, पुनः प्रारंभ करते हैं... परिचित लगता है? यदि हाँ, तो यह लेख आपके लिए है।

\n\n

प्रोडक्शन C++ की दुनिया में निगरानी और लॉगिंग कोई विलासिता नहीं, बल्कि एक आवश्यकता है। इनके बिना, आप अंधेरे कमरे में तिल की तरह अंधे हैं। लेकिन अच्छी खबर यह है कि आधुनिक C++ (विशेष रूप से C++17 से शुरू) एक पारदर्शी, अवलोकनीय प्रणाली बनाने के लिए सभी उपकरण प्रदान करता है।

\n\n

इस लेख में, हम यह समझेंगे कि वास्तविक लाइब्रेरी और तकनीकों का उपयोग करके अपने एप्लिकेशन को 'ब्लैक बॉक्स' से पूरी तरह से पारदर्शी प्रणाली में कैसे बदला जाए। आप सीखेंगे कि कैसे लॉग करें ताकि लॉग उपयोगी हों, न कि केवल शोर मचाएं, और निगरानी कैसे सेट करें जो वास्तव में डिप्लॉयमेंट में मदद करे।

\n\n

केवल std::cout का उपयोग क्यों दर्दनाक है?

\n\n

कई शुरुआती C++ डेवलपर इस तरह लिखते हैं:

\n\n
std::cout << "त्रुटि: फ़ाइल नहीं मिली" << std::endl;
\n\n

पहली नज़र में - ठीक है। लेकिन आइए समस्याओं के बारे में सोचें:

\n\n
    \n
  • महत्व स्तर नहीं हैं। आप डीबग संदेश को गंभीर त्रुटि से अलग नहीं कर सकते।
  • \n
  • टाइमस्टैम्प नहीं हैं। यह कब हुआ? कल? एक सेकंड पहले?
  • \n
  • कोई संदर्भ नहीं है। कौन सा थ्रेड? कौन सा अनुरोध? कौन सा डेटा?
  • \n
  • ब्लॉकिंग आउटपुट। std::endl बफर को फ्लश करता है, जो उच्च-लोड सिस्टम में प्रदर्शन को मार देता है।
  • \n
  • कोई रोटेशन नहीं है। लॉग फ़ाइल अनंत रूप से बढ़ती रहेगी जब तक कि वह पूरी डिस्क न भर दे।
  • \n
\n\n

संक्षेप में, std::cout केवल खिलौना प्रोजेक्ट के लिए उपयुक्त है। गंभीर C++ प्रोडक्शन के लिए C++ अनुप्रयोगों की लॉगिंग के लिए एक गंभीर दृष्टिकोण की आवश्यकता है।

\n\n

Spdlog: आपका नया सबसे अच्छा दोस्त

\n\n

spdlog लाइब्रेरी आधुनिक C++ में लॉगिंग का स्वर्ण मानक है। यह तेज़ (सबसे तेज़ में से एक), header-only (संकलित करने की आवश्यकता नहीं), और अविश्वसनीय रूप से लचीली है। आइए देखें कि इसे सही तरीके से कैसे कॉन्फ़िगर किया जाए।

\n\n

स्थापना और बुनियादी कॉन्फ़िगरेशन

\n\n

Spdlog को CMake FetchContent के माध्यम से जोड़ा जा सकता है या बस हेडर कॉपी किए जा सकते हैं। प्रोडक्शन के लिए न्यूनतम कॉन्फ़िगरेशन यहां दिया गया है:

\n\n
#include <spdlog/spdlog.h>\n#include <spdlog/sinks/rotating_file_sink.h>\n#include <spdlog/sinks/stdout_color_sinks.h>\n#include <memory>\n\nvoid setup_logging() {\n    // रंगीन आउटपुट के साथ कंसोल लॉगर बनाएं\n    auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();\n    \n    // रोटेशन के साथ फ़ाइल लॉगर बनाएं: 10 MB के 5 फ़ाइलें\n    auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(\n        "logs/myapp.log",  // फ़ाइल का पथ\n        10 * 1024 * 1024,   // अधिकतम फ़ाइल आकार: 10 MB\n        5                   // रोटेशन के लिए फ़ाइलों की संख्या\n    );\n\n    // मल्टी-थ्रेडेड लॉगर में संयोजित करें\n    auto logger = std::make_shared<spdlog::logger>(\n        "main_logger",\n        spdlog::sinks_init_list{console_sink, file_sink}\n    );\n\n    // प्रारूप सेट करें: [समय] [स्तर] [लॉगर_नाम] संदेश\n    logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%n] %v");\n    \n    // वैश्विक लॉगिंग स्तर सेट करें (रनटाइम पर बदला जा सकता है)\n    logger->set_level(spdlog::level::info);\n    \n    // वैश्विक लॉगर के रूप में पंजीकृत करें\n    spdlog::set_default_logger(logger);\n}\n\nint main() {\n    setup_logging();\n    \n    spdlog::info("एप्लिकेशन प्रारंभ हुआ। संस्करण: {}", APP_VERSION);\n    spdlog::warn("कॉन्फ़िगरेशन नहीं मिला, डिफ़ॉल्ट मानों का उपयोग कर रहे हैं");\n    \n    try {\n        // कुछ कोड\n        throw std::runtime_error("DB से कनेक्शन में त्रुटि");\n    } catch (const std                

ब्लॉग

पुस्तक अनुशंसाएँ