परिचय: Go में लॉगिंग सिर्फ fmt.Println क्यों नहीं है
\n\nलॉगिंग किसी भी प्रोडक्शन एप्लिकेशन की आंखें और कान हैं। Go (Golang) की दुनिया में, लॉगिंग के दृष्टिकोण में महत्वपूर्ण विकास हुआ है: fmt.Println के माध्यम से सरल कंसोल आउटपुट से लेकर शक्तिशाली संरचनात्मक लॉगर्स तक, जो केंद्रीकृत लॉग संग्रह प्रणालियों (ELK, Grafana Loki, Datadog) के लिए JSON-संगत रिकॉर्ड उत्पन्न करने में सक्षम हैं।
इस लेख में, हम सिद्धांत के बजाय व्यवहार में Go लॉगिंग के सर्वोत्तम अभ्यासों का विश्लेषण करेंगे। आप सीखेंगे कि लॉगिंग स्तरों को कैसे कॉन्फ़िगर करें, संरचित लॉग का उपयोग कैसे करें, "शोर" से कैसे बचें और त्रुटियों को सही तरीके से कैसे संभालें। सभी कोड उदाहरण आपके प्रोजेक्ट में उपयोग के लिए तैयार हैं।
\n\n1. मानक log लाइब्रेरी: कब पर्याप्त है और कब नहीं
\n\nGo मानक लाइब्रेरी से एक अंतर्निहित log पैकेज प्रदान करता है। यह सरल है, लेकिन इसमें महत्वपूर्ण सीमाएँ हैं।
मूल उदाहरण
\npackage main\n\nimport (\n "log"\n "os"\n)\n\nfunc main() {\n // फ़ाइल में आउटपुट सेट करना\n file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)\n defer file.Close()\n log.SetOutput(file)\n\n log.Println("एप्लिकेशन शुरू हुआ")\n log.Printf("उपयोगकर्ता %s प्रमाणित हुआ", "admin")\n log.Fatal("गंभीर त्रुटि: DB से कनेक्ट नहीं हो सका")\n}\n\n\nलाभ:
\n- \n
- तीसरे पक्ष की निर्भरता स्थापित करने की आवश्यकता नहीं है। \n
- छोटी स्क्रिप्ट या CLI उपयोगिताओं के लिए उपयोग में आसानी। \n
नुकसान:
\n- \n
- कोई लॉगिंग स्तर नहीं (केवल Print, Fatal, Panic)। \n
- आउटपुट प्रारूप निश्चित है (दिनांक, समय, संदेश)। \n
- कोई संरचित फ़ील्ड नहीं (कुंजी-मान)। \n
- लॉग संग्रह प्रणालियों द्वारा पार्स करना कठिन। \n
निष्कर्ष: प्रोडक्शन सेवाओं, माइक्रोसर्विस आर्किटेक्चर या किसी भी एप्लिकेशन के लिए जहाँ मॉनिटरिंग की आवश्यकता है, मानक log उपयुक्त नहीं है। संरचनात्मक लॉगिंग पर स्विच करें।
2. zerolog के साथ संरचनात्मक लॉगिंग: आधुनिक मानक
\n\nzerolog लाइब्रेरी Go में सबसे लोकप्रिय और तेज़ लॉगर्स में से एक है। यह लॉगिंग स्तरों, डिफ़ॉल्ट रूप से JSON आउटपुट और न्यूनतम मेमोरी आवंटन का समर्थन करता है।
स्थापना
\ngo get -u github.com/rs/zerolog/log\n\nकॉन्फ़िगरेशन और उपयोग का उदाहरण
\npackage main\n\nimport (\n "os"\n "time"\n\n "github.com/rs/zerolog"\n "github.com/rs/zerolog/log"\n)\n\nfunc main() {\n // समय प्रारूप सेट करना\n zerolog.TimeFieldFormat = time.RFC3339\n\n // रंगों के साथ कंसोल आउटपुट (डेवलपमेंट के लिए)\n log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})\n\n // प्रोडक्शन के लिए — stdout में JSON\n // log.Logger = zerolog.New(os.Stdout).With().Timestamp().Logger()\n\n log.Info().Msg("सर्वर पोर्ट 8080 पर शुरू हुआ")\n log.Debug().Str("module", "auth").Msg("उपयोगकर्ता लॉगिन प्रयास")\n log.Error().Err(err).Str("user_id", "12345").Msg("प्रमाणीकरण त्रुटि")\n log.Fatal().Int("attempt", 3).Msg("प्रयासों की संख्या पार हो गई")\n}\n\n\nzerolog में लॉगिंग स्तर
\n- \n
- Trace (
log.Trace()) — गहन डिबगिंग के लिए। \n - Debug (
log.Debug()) — डिबग जानकारी। \n - Info (
log.Info()) — सामान्य घटनाएँ। \n - Warn (
log.Warn()) — चेतावनियाँ (त्रुटियाँ नहीं)। \n - Error (
log.Error()) — त्रुटियाँ जिन पर ध्यान देने की आवश्यकता है। \n - Fatal (
log.Fatal()) — घातक त्रुटियाँ (प्रोग्राम समाप्त करता है)। \n - Panic (
log.Panic()) — स्टैक ट्रेस के साथ पैनिक। \n
सर्वोत्तम अभ्यास: प्रोडक्शन में, न्यूनतम