Structured Logging क्यों
System.out.println से आगे
Structured Logging क्यों, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
println की समस्या
System.out.println त्वरित प्रयोग के लिए ठीक है, लेकिन वास्तविक अनुप्रयोगों में लॉग लेखन के लिए यह खराब उपकरण है।
- इसमें समय-मुद्राएँ, स्तर या थ्रेड के नाम नहीं होते।
- उत्पादन वातावरण में इसे बंद करने का कोई तरीका नहीं होता।
- यह बिना किसी रूटिंग के केवल मानक आउटपुट में लिखता है।
public class Main {
public static void main(String[] args) {
// Crude: no level, no timestamp, always on
System.out.println("User logged in");
}
}लॉग लेखन फ़्रेमवर्क क्या जोड़ते हैं
लॉग लेखन फ़्रेमवर्क आपको देते हैं:
- शोर को फ़िल्टर करने के लिए स्तर (TRACE, DEBUG, INFO, WARN, ERROR)।
- स्वचालित रूप से समय-मुद्राएँ, थ्रेड और लॉगर के नाम।
- फ़ाइलों, कंसोल या दूरस्थ सिस्टम तक रूटिंग।
- दोबारा कंपाइल किए बिना रनटाइम कॉन्फ़िगरेशन।
public class Main {
public static void main(String[] args) {
// A framework would render: time, level, logger, thread, message
String simulated = "2026-01-01 10:00:00 INFO c.e.App [main] - User logged in";
System.out.println(simulated);
}
}लॉग स्तरों की व्याख्या
स्तर संदेशों को उनके महत्व के अनुसार क्रम देते हैं:
- TRACE: बहुत सूक्ष्म विवरण।
- DEBUG: विकास संबंधी निदान।
- INFO: सामान्य महत्वपूर्ण पड़ाव।
- WARN: कुछ अप्रत्याशित, लेकिन जिससे उबरा जा सकता है।
- ERROR: ध्यान देने योग्य विफलता।
public class Main {
enum Level { TRACE, DEBUG, INFO, WARN, ERROR }
public static void main(String[] args) {
Level threshold = Level.INFO;
for (Level l : Level.values()) {
boolean shown = l.ordinal() >= threshold.ordinal();
System.out.println(l + " visible? " + shown);
}
}
}सीमा के आधार पर फ़िल्टर करना
एक लॉगर की एक सीमा होती है। सीमा से नीचे के संदेश कम लागत में हटा दिए जाते हैं।
उत्पादन वातावरण में आप INFO सेट कर सकते हैं, जिससे DEBUG और TRACE गायब हो जाते हैं और कोड बदले बिना शोर तथा लागत कम होती है।
public class Main {
enum Level { TRACE, DEBUG, INFO, WARN, ERROR }
static void log(Level threshold, Level level, String msg) {
if (level.ordinal() >= threshold.ordinal()) {
System.out.println(level + " - " + msg);
}
}
public static void main(String[] args) {
Level t = Level.WARN;
log(t, Level.DEBUG, "hidden detail");
log(t, Level.ERROR, "shown error");
}
}संरचित बनाम असंरचित
असंरचित लॉग साधारण वाक्य होते हैं। संरचित लॉग कुंजी-मान संदर्भ (उपयोगकर्ता पहचान, अनुरोध पहचान) जोड़ते हैं जिन्हें मशीनें पढ़ सकती हैं।
संरचित लॉग Elasticsearch या Loki जैसे उपकरणों में खोजे और एकत्र किए जा सकते हैं।
import java.util.Map;
public class Main {
public static void main(String[] args) {
// Structured context as key-value pairs
Map<String, Object> fields = Map.of("event", "login", "userId", 42, "ok", true);
System.out.println(fields);
}
}फ़ैकेड की अवधारणा
आपको अपने कोड को किसी विशेष लॉग लेखन लाइब्रेरी से नहीं जोड़ना चाहिए। SLF4J जैसा फ़ैकेड आपको एक एपीआई के आधार पर कोड लिखने और बाद में बैकएंड (Logback, Log4j2) बदलने देता है।
इससे आपका अनुप्रयोग लॉग लेखन के कार्यान्वयन संबंधी विकल्पों से अलग रहता है।
public class Main {
public static void main(String[] args) {
// Concept: your code calls a facade interface, not a concrete logger
System.out.println("App -> SLF4J facade -> Logback backend");
}
}सिर्फ़ Boolean फ़्लैग का उपयोग क्यों नहीं?
कुछ कोड if (DEBUG) System.out.println(...) का उपयोग करते हैं। इससे पूरे कोडबेस में अनावश्यक कोड फैलता है और हर पैकेज पर अलग नियंत्रण नहीं मिलता।
लॉग लेखन फ़्रेमवर्क कॉन्फ़िगरेशन को केंद्रीकृत करता है: एक पैकेज के लिए DEBUG सक्षम करें और बाकी सभी के लिए ERROR।
public class Main {
static final boolean DEBUG = false;
public static void main(String[] args) {
// Inflexible: one global switch, scattered checks
if (DEBUG) System.out.println("diagnostic");
System.out.println("A framework controls this per logger instead");
}
}प्रदर्शन संबंधी चिंताएँ
बंद होने पर लॉग लेखन कम लागत वाला होना चाहिए। फ़्रेमवर्क फ़िल्टर किए गए स्तरों का काम छोड़ देते हैं और पैरामीटरयुक्त संदेश उन स्ट्रिंग को बनाने से बचाते हैं जिन्हें आप बाद में छोड़ देंगे।
println अपने तर्क का मूल्यांकन हमेशा करता है, भले ही आउटपुट कोई न पढ़े।
public class Main {
static String expensive() {
System.out.println("(building expensive string)");
return "big report";
}
public static void main(String[] args) {
boolean debugEnabled = false;
// Only build the message if it will actually be logged
if (debugEnabled) System.out.println(expensive());
System.out.println("skipped expensive work");
}
}केंद्रीकृत आउटपुट रूटिंग
फ़्रेमवर्क लॉग को एक या अधिक संलग्नकों तक भेजते हैं: कंसोल, घूमती हुई फ़ाइलें, syslog या नेटवर्क संग्राहक।
आप रूटिंग को एक बार कॉन्फ़िगर करते हैं; अनुप्रयोग कोड वैसा ही रहता है।
public class Main {
public static void main(String[] args) {
String[] appenders = {"CONSOLE", "ROLLING_FILE", "JSON_HTTP"};
for (String a : appenders) System.out.println("route logs to: " + a);
}
}सहसंबंध और संदर्भ
वास्तविक सिस्टम अनुरोध के दौरान हर लॉग पंक्ति में एक अनुरोध पहचान जोड़ते हैं, ताकि आप थ्रेड और सेवाओं के बीच किसी एक उपयोगकर्ता की यात्रा का पता लगा सकें।
SLF4J यह सुविधा MDC (Mapped Diagnostic Context) के माध्यम से देता है।
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> mdc = new HashMap<>();
mdc.put("requestId", "req-1234");
System.out.println("All logs in this request tagged with " + mdc);
}
}योजना
इस पाठ्यक्रम में आप:
- SLF4J फ़ैकेड का उपयोग करेंगे और लॉगर प्राप्त करेंगे।
- सही स्तर पर लॉग लिखेंगे।
- दक्षता के लिए पैरामीटरयुक्त संदेशों का उपयोग करेंगे।
- संलग्नकों और पैटर्न के साथ Logback कॉन्फ़िगर करेंगे।
public class Main {
public static void main(String[] args) {
System.out.println("Next: SLF4J facade and loggers");
}
}त्वरित जाँच
संरचित लॉगिंग की अपनी समझ जाँचिए।
पुनरावलोकन
आपने जाना कि संरचित लॉगिंग क्यों महत्वपूर्ण है:
- println में स्तर, मेटाडेटा और रूटिंग की सुविधा नहीं होती।
- फ़्रेमवर्क स्तर, फ़िल्टरिंग और एपेंडर जोड़ते हैं।
- एक फैसाड कोड को बैकएंड से अलग रखता है।
- संरचित संदर्भ और MDC सहसंबंध को सक्षम करते हैं।
अगला विषय SLF4J फैसाड और लॉगर बनाना है।
public class Main {
public static void main(String[] args) {
System.out.println("Structured logging recap complete");
}
}एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Structured Logging क्यों” पाठ निःशुल्क है?
हाँ—“Structured Logging क्यों” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Structured Logging क्यों” में मैं क्या सीखूँगा?
System.out.println से आगे आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“Structured Logging क्यों” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Structured Logging क्यों
- SLF4J Facade और Loggers
- Parameterized Logging
- Logback कॉन्फ़िगर करना