क्यों एक "खामोश" Kotlin-एप्लिकेशन एक टाइम बम है
\n\nकल्पना करें: आपने Kotlin पर एक सेवा शुरू की है, यह घड़ी की तरह काम कर रही है। उपयोगकर्ता खुश हैं, मीट्रिक्स हरे हैं। लेकिन एक दिन लोड बढ़ जाता है, latency बढ़ जाती है, और आपको पता नहीं है कि क्यों। लॉगिंग और निगरानी के बिना, आप बिना नक्शे और रडार के जहाज के कप्तान हैं। इस लेख में, हम देखेंगे कि कैसे अपने एप्लिकेशन को "ब्लैक बॉक्स" से एक पारदर्शी सिस्टम में बदलें, जहाँ हर विफलता नंगी आँखों से दिखाई देती है।
\n\nहम दस्तावेज़ीकरण की नकल नहीं करेंगे। इसके बजाय - वास्तविक मामले, तैयार स्निपेट और आर्किटेक्चरल समाधान जो प्रोडक्शन में काम करते हैं। चलिए शुरू करते हैं।
\n\nहाथी को टुकड़ों में बाँटना: लॉगिंग बनाम निगरानी
\n\nकोड लिखने से पहले, आइए शर्तों पर सहमत हों। लॉगिंग घटनाओं (त्रुटियों, चेतावनियों, डिबग जानकारी) को संरचित या टेक्स्ट रूप में रिकॉर्ड करना है। निगरानी मीट्रिक्स (प्रतिक्रिया समय, अनुरोधों की संख्या, CPU लोड) एकत्र करना और उनका विज़ुअलाइज़ेशन है। आदर्श रूप से, वे एक साथ काम करते हैं: घटना के गहन विश्लेषण के लिए लॉग की आवश्यकता होती है, विसंगतियों का तेजी से पता लगाने के लिए मीट्रिक्स की।
\n\nKotlin में लॉगिंग सेट करना: सरल से जटिल तक
\n\nलाइब्रेरी चुनना: SLF4J + Logback - स्वर्ण मानक
\n\nKotlin Java इकोसिस्टम के साथ अच्छी तरह से काम करता है, इसलिए SLF4J (फ़ेसेड) और Logback (कार्यान्वयन) नंबर 1 विकल्प हैं। वे हल्के, कुशल हैं और एसिंक्रोनस लॉगिंग का समर्थन करते हैं।
\n\nbuild.gradle.kts में जोड़ें:
implementation("ch.qos.logback:logback-classic:1.4.14")\nimplementation("io.github.microutils:kotlin-logging-jvm:3.0.5")\n\nkotlin-logging SLF4J के ऊपर एक पतली रैपर है जो कोड को साफ बनाती है। तुलना करें:
\n\nरैपर के बिना:
\nprivate val logger = LoggerFactory.getLogger(MyService::class.java)\nlogger.info("User {} logged in", userId)\n\nkotlin-logging के साथ:
\nprivate val logger = KotlinLogging.logger {}\nlogger.info { "User $userId logged in" }\n\nस्ट्रिंग की आलसी गणना प्रदर्शन के लिए एक बोनस है: स्ट्रिंग तभी बनेगी जब लॉगिंग स्तर सक्षम हो।
\n\nLogback कॉन्फ़िगरेशन: संरचित लॉग - अनिवार्य
\n\nsrc/main/resources में logback.xml बनाएँ:
<configuration>\n <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">\n <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>\n </appender>\n\n <root level="INFO">\n <appender-ref ref="CONSOLE"/>\n </root>\n</configuration>\n\nहम LogstashEncoder का उपयोग कर रहे हैं - यह लॉग को JSON में बदल देता है। यह महत्वपूर्ण है यदि आप लॉग को Elasticsearch, Loki या किसी अन्य एग्रीगेटर को भेज रहे हैं। JSON लॉग को पार्स करना, फ़िल्टर करना और विश्लेषण करना आसान है।
\n\nनिर्भरता जोड़ना न भूलें:
\nimplementation("net.logstash.logback:logstash-logback-encoder:7.4")\n\nसार्थक लॉग लिखना: संदर्भ ही सब कुछ है
\n\n"Error occurred" जैसे लॉग बेकार हैं। MDC (Mapped Diagnostic Context) जोड़ें - यह आपके लॉग के लिए टैग की तरह है।
import org.slf4j.MDC\n\nclass OrderService {\n private val logger = KotlinLogging.logger {}\n\n fun processOrder(orderId: String, userId: String) {\n MDC.put("orderId", orderId)\n MDC.put("userId", userId)\n try {\n logger.info { "Processing order" }\n // व्यावसायिक तर्क\n } catch (e: Exception) {\n logger.error(e) { "Order processing failed" }\n } finally {\n MDC.clear()\n }\n }\n}\n\nअब लॉग एग्रीगेटर में, आप एक विशिष्ट ऑर्डर या उपयोगकर्ता के लिए सेकंडों में सभी रिकॉर्ड पा सकते हैं।
\n\n