परिचय: C++ में उचित लॉगिंग की आवश्यकता क्यों है?
लॉगिंग केवल फ़ाइल में संदेश लिखना नहीं है। प्रोडक्शन वातावरण में, यह मॉनिटरिंग, डीबगिंग और ऑडिट के लिए आपका मुख्य उपकरण है। खराब तरीके से कॉन्फ़िगर की गई लॉगिंग से महत्वपूर्ण डेटा का नुकसान, प्रदर्शन में कमी (I/O-bound), या इसके विपरीत, डिस्क पर "शोर" भरा कचरा हो सकता है। इस लेख में, हम C++ में लॉगिंग की सर्वोत्तम प्रथाओं पर चर्चा करेंगे जो आपको सामान्य गलतियों से बचने और एक विश्वसनीय लॉग संग्रह प्रणाली बनाने में मदद करेंगी।
1. लाइब्रेरी का चयन: spdlog बनाम glog बनाम std::clog
मानक C++ लाइब्रेरी केवल बुनियादी स्ट्रीम std::clog और std::cerr प्रदान करती है, जो गंभीर प्रोजेक्ट्स के लिए उपयुक्त नहीं हैं। आइए तीन लोकप्रिय दृष्टिकोणों पर विचार करें:
1.1. spdlog — आधुनिक मानक
spdlog एक header-only लाइब्रेरी है जो एसिंक्रोनस लॉगिंग, फ़ाइल रोटेशन, फ़ॉर्मेटिंग (fmtlib की तरह) और कई सिंक (फ़ाइल, कंसोल, syslog, Kafka) का समर्थन करती है।
मुख्य लाभ:
- उच्च प्रदर्शन (एसिंक्रोनस थ्रेड्स के कारण)
- लेवल और फ़ॉर्मेट का लचीला कॉन्फ़िगरेशन
- स्ट्रक्चर्ड लॉगिंग (JSON) का समर्थन
#include <spdlog/spdlog.h>#include <spdlog/sinks/rotating_file_sink.h>
int main() { // एक रोटेटिंग फ़ाइल लॉगर बनाएं (5 फ़ाइलें प्रत्येक 10 MB) auto logger = spdlog::rotating_logger_mt("file_logger", "logs/app.log", 1048576 * 10, 5); logger->set_level(spdlog::level::info); logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");
logger->info("एप्लिकेशन शुरू हुआ"); logger->warn("कम मेमोरी शेष: {} MB", free_memory); logger->error("DB कनेक्शन त्रुटि: {}", err.what()); return 0;}1.2. Google glog — एक सिद्ध समाधान
Google की glog लाइब्रेरी उपयोग में सरल है और इसमें सशर्त लॉगिंग और स्टैक डंप के लिए अंतर्निहित समर्थन है। नकारात्मक पक्ष — कम लचीला फ़ॉर्मेटिंग और एसिंक्रोनसिटी का अभाव।
#include <glog/logging.h>
int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); FLAGS_log_dir = "./logs"; FLAGS_stderrthreshold = google::WARNING; // WARNING+ को stderr पर डुप्लिकेट करें
LOG(INFO) << "सर्वर पोर्ट पर शुरू हुआ " << port; LOG_IF(WARNING, memory_usage > 0.9) << "मेमोरी लगभग समाप्त"; LOG(FATAL) << "गंभीर त्रुटि, समाप्त हो रहा है"; return 0;}1.3. std::clog पर आधारित स्व-निर्मित लॉगर
डीबगिंग या बहुत छोटी उपयोगिताओं के लिए ही std::clog का उपयोग करें। यह रोटेशन, लेवल और मल्टीथ्रेडिंग का समर्थन नहीं करता है।
#define LOG(level, msg) std::clog << "[" << level << "] " << msg << std::endl;LOG("INFO", "शुरू");LOG("ERROR", "त्रुटि: " + std::to_string(errno));2. कॉन्फ़िगरेशन और आर्किटेक्चर के लिए सर्वोत्तम अभ्यास
यदि लॉगिंग आर्किटेक्चर गलत तरीके से बनाया गया है, तो सबसे अच्छी लाइब्रेरी भी मदद नहीं करेगी। निम्नलिखित सिद्धांतों का पालन करें:
2.1. लॉगिंग लेवल का उपयोग करें
5-6 लेवल परिभाषित करें और उनका सख्ती से पालन करें:
- TRACE — विस्तृत डीबगिंग (फ़ंक्शन में प्रवेश/निकास)
- DEBUG — डेवलपर्स के लिए डीबग जानकारी
- INFO — एप्लिकेशन का सामान्य संचालन (शुरू, समाप्त)
- WARN — संभावित समस्याएं (कम डिस्क, उच्च लोड)
- ERROR — त्रुटियां जो काम को बाधित नहीं करतीं (अपवाद)
- FATAL — गंभीर त्रुटि, जिसके बाद एप्लिकेशन समाप्त हो जाता है
// प्रोडक्शन में हम WARN सेट करते हैं ताकि INFO संदेशों से लॉग न भरेंlogger->set_level(spdlog::level::warn);2.2. स्ट्रक्चर्ड लॉगिंग (JSON)
के लिए
```