C++ में लॉगिंग: व्यवहार में सर्वोत्तम अभ्यास

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

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

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

परिचय: लॉगिंग सिर्फ टेक्स्ट आउटपुट से कहीं अधिक क्यों है?

\n\n

आधुनिक C++ डेवलपमेंट में, लॉगिंग साधारण std::cout से आगे निकल गई है। यह एप्लिकेशन की डिबगिंग, मॉनिटरिंग और ऑडिटिंग के लिए एक महत्वपूर्ण उपकरण है। हालांकि, गलत कार्यान्वयन प्रदर्शन में गिरावट, डेटा हानि या डिस्क स्थान को अव्यवस्थित कर सकता है। इस लेख में, हम C++ में लॉगिंग के सर्वोत्तम अभ्यासों को ठोस उदाहरणों के साथ समझेंगे, जिन्हें आप तुरंत वास्तविक प्रोजेक्ट्स में लागू कर सकते हैं।

\n\n

1. लॉगिंग लाइब्रेरी का चयन: spdlog और विकल्प

\n\n

C++ मानक लाइब्रेरी लचीली लॉगिंग के लिए अंतर्निहित साधन प्रदान नहीं करती है। सत्यापित तृतीय-पक्ष समाधानों का उपयोग करने की अनुशंसा की जाती है। Spdlog अपने उच्च प्रदर्शन और सरल एकीकरण के कारण सबसे लोकप्रिय लाइब्रेरी में से एक है।

\n\n

spdlog की स्थापना (vcpkg या header-only)

\n
// vcpkg के माध्यम से स्थापना\nvcpkg install spdlog\n\n// या header-only संस्करण का उपयोग करें\n#include "spdlog/spdlog.h"\n#include "spdlog/sinks/basic_file_sink.h"\n#include "spdlog/sinks/rotating_file_sink.h"
\n\n

लॉगर सेटअप का मूल उदाहरण

\n
#include <memory>\n#include "spdlog/spdlog.h"\n#include "spdlog/sinks/stdout_color_sinks.h"\n\nint main() {\n    // रंगीन आउटपुट के साथ कंसोल लॉगर बनाएं\n    auto console = spdlog::stdout_color_mt("console");\n    \n    // लॉगिंग स्तर सेट करें\n    spdlog::set_level(spdlog::level::debug);\n    \n    // संदेशों के उदाहरण\n    console->info("एप्लिकेशन शुरू हुआ");\n    console->warn("संभावित समस्या का पता चला");\n    console->error("गंभीर त्रुटि: {}", errno);\n    \n    return 0;\n}
\n\n

विकल्प: Boost.Log (एंटरप्राइज़ प्रोजेक्ट्स के लिए), Google Glog (यदि Google Test के साथ एकीकरण आवश्यक हो)। एम्बेडेड सिस्टम के लिए EasyLogger का उपयोग करें।

\n\n

2. लॉगिंग स्तर और फ़िल्टरिंग

\n\n

लॉगिंग स्तरों का सही उपयोग लॉग की पठनीयता की कुंजी है। C++ में निम्नलिखित पदानुक्रम अपनाया जाता है (सबसे महत्वपूर्ण से सबसे कम महत्वपूर्ण तक):

\n\n
    \n
  • TRACE — निष्पादन का विस्तृत अनुरेखण (केवल डिबगिंग के लिए)
  • \n
  • DEBUG — डिबगिंग जानकारी
  • \n
  • INFO — एप्लिकेशन संचालन के बारे में सूचनात्मक संदेश
  • \n
  • WARN — संभावित समस्याओं के बारे में चेतावनी
  • \n
  • ERROR — त्रुटियाँ जो एप्लिकेशन के संचालन को बाधित नहीं करतीं
  • \n
  • CRITICAL — घातक त्रुटियाँ जिनमें तत्काल हस्तक्षेप की आवश्यकता है
  • \n
\n\n

spdlog में फ़िल्टरिंग सेट करना

\n
// केवल WARN और उससे ऊपर शामिल करें\nspdlog::set_level(spdlog::level::warn);\n\n// डिबगिंग के लिए सभी स्तर शामिल करें\n#ifdef _DEBUG\n    spdlog::set_level(spdlog::level::trace);\n#endif\n\n// मैक्रोज़ के साथ उपयोग का उदाहरण\n#define LOG_TRACE(...)   spdlog::trace(__VA_ARGS__)\n#define LOG_ERROR(...)   spdlog::error(__VA_ARGS__)\n\nLOG_TRACE("फ़ंक्शन processData() में प्रवेश");\nLOG_ERROR("फ़ाइल खोलने में विफल: {}", filename);
\n\n

सुझाव: Production बिल्ड में कभी भी TRACE का उपयोग न करें — स्ट्रिंग फ़ॉर्मेटिंग के कारण यह प्रदर्शन को 10-100 गुना कम कर सकता है।

\n\n

3. लॉगिंग का प्रदर्शन: सिंक्रोनस बनाम एसिंक्रोनस मोड

\n\n

उच्च-लोड सिस्टम में, सिंक्रोनस लॉगिंग एक अड़चन बन सकती है। लॉगर का प्रत्येक कॉल रिकॉर्डिंग पूरी होने तक थ्रेड को ब्लॉक करता है। समाधान एसिंक्रोनस लॉगिंग है।

\n\n

spdlog में एसिंक्रोनस लॉगर सेट करना

\n
#include "spdlog/async.h"\n#include "spdlog/sinks/rotating_file_sink.h"\n\nint main() {\n    // कतार आकार 8192 के साथ एसिंक्रोनस लॉगर बनाएं\n    spdlog::init_thread_pool(8192, 1); // प्रोसेसिंग के लिए 1 थ्रेड\n    \n    auto async_file = spdlog::rotating_logger_mt<spdlog::async_factory>(\n        "async_logger", "logs/app.log", 102                

ब्लॉग

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