C++ अनुप्रयोगों में लॉगिंग: सर्वोत्तम अभ्यास और उपकरण

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

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

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

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



लॉगिंग किसी भी गंभीर C++ सॉफ़्टवेयर विकास का एक मूलभूत हिस्सा है। एक विश्वसनीय लॉगिंग प्रणाली के बिना, जटिल त्रुटियों की डिबगिंग, प्रदर्शन की निगरानी और सुरक्षा ऑडिट लगभग असंभव हो जाता है। इस लेख में, हम लाइब्रेरी चयन से लेकर उन्नत फ़ॉर्मेटिंग और फ़ाइल रोटेशन तकनीकों तक, C++ में लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे।



1. लॉगिंग लाइब्रेरी का चयन



C++ में लॉगिंग के लिए कई परिपक्व लाइब्रेरी मौजूद हैं। अपना स्वयं का कार्यान्वयन करने के बजाय तैयार समाधान का उपयोग करने से समय बचता है और बग की संख्या कम होती है।



  • spdlog — सबसे लोकप्रिय लाइब्रेरी। यह उच्च प्रदर्शन (header-only, एसिंक्रोनस मोड), सरल API और कई फ़ॉर्मेट (JSON, plain text) के समर्थन के लिए जानी जाती है।
  • Boost.Log — Boost का एक शक्तिशाली लेकिन भारी लाइब्रेरी। यह एंटरप्राइज़ प्रोजेक्ट्स के लिए आदर्श है जहाँ जटिल फ़िल्टरिंग और बैकएंड के लचीले कॉन्फ़िगरेशन की आवश्यकता होती है।
  • Google Logging (glog) — Google की एक सरल लाइब्रेरी। यह छोटे प्रोजेक्ट्स के लिए उपयुक्त है, लेकिन कम लचीली है।


spdlog के आरंभीकरण का उदाहरण:



#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>

int main() { // एक लॉगर बनाएं जो "logs/app.log" फ़ाइल में लिखता है auto logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); // लॉगिंग स्तर सेट करें logger->set_level(spdlog::level::debug); // संदेश लॉग करें logger->info("एप्लिकेशन शुरू हुआ"); return 0;}


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



लॉगिंग स्तरों (trace, debug, info, warning, error, critical) का उपयोग एक डी-फैक्टो मानक है। वे आपको वातावरण (डेवलपमेंट, टेस्टिंग, प्रोडक्शन) के आधार पर आउटपुट जानकारी की मात्रा को लचीले ढंग से कॉन्फ़िगर करने की अनुमति देते हैं।



स्तरों के लिए सुझाव:

  • Trace/Debug — केवल डेवलपमेंट के लिए। निष्पादन प्रवाह, चर मानों के बारे में विस्तृत जानकारी।
  • Info — मानक घटनाएँ: सेवा का प्रारंभ/रोक, सफल संचालन।
  • Warning — असामान्य स्थितियाँ जो त्रुटि का कारण नहीं बनतीं (जैसे, पुराने API का उपयोग)।
  • Error — त्रुटियाँ जिन पर ध्यान देने की आवश्यकता है, लेकिन घातक नहीं हैं।
  • Critical — घातक त्रुटियाँ, जिनके बाद एप्लिकेशन काम करना जारी नहीं रख सकता।


spdlog में फ़िल्टरिंग सेट करने का उदाहरण:



// प्रोडक्शन में केवल warning और उससे ऊपर लिखेंauto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();console_sink->set_level(spdlog::level::warn);

// फ़ाइल में debug सहित सब कुछ लिखेंauto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/debug.log");file_sink->set_level(spdlog::level::debug);

auto logger = std::make_shared<spdlog::logger>("multi_sink", spdlog::sinks_init_list({console_sink, file_sink}));

spdlog::register_logger(logger);


3. प्रदर्शन और एसिंक्रोनस लॉगिंग



सिंक्रोनस लॉगिंग प्रदर्शन में बाधा बन सकती है, विशेष रूप से उच्च-लोड सिस्टम में। logger->info(...) का प्रत्येक कॉल डिस्क पर लेखन पूरा होने तक थ्रेड को ब्लॉक करता है।



प्रदर्शन के लिए सर्वोत्तम अभ्यास:

  • एसिंक्रोनस लॉगिंग — लॉग लिखने के लिए एक अलग थ्रेड का उपयोग करें। spdlog इसे आउट-ऑफ-द-बॉक्स सपोर्ट करता है।
  • लॉग लाइनों में महंगे ऑपरेशन से बचें — लॉगिंग मैक्रो के अंदर भारी फ़ंक्शन को कॉल न करें। उदाहरण के लिए, logger->info("Result: {}", computeExpensiveValue()); computeExpensiveValue() को कॉल करेगा भले ही लॉग स्तर

ब्लॉग

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