पाठ 33 / 38
SLF4J व संरचित लॉगिंग
System.out.println से डिबग करना बंद करें — SLF4J के ज़रिए Logback जैसे असली backend पर लॉग करें, सही level चुनें, और समझें प्रोडक्शन में यह क्यों मायने रखता है।
System.out.println क्यों नहीं
println को प्रति-क्लास बंद नहीं किया जा सकता, फ़ाइल या log aggregator पर नहीं भेजा जा सकता, इसमें timestamp/level/thread जानकारी नहीं होती, और यह वास्तव में एक synchronized कॉल है जो थ्रेड को क्रमबद्ध कर सकता है। एक logging फ़्रेमवर्क यह सब मुफ़्त में देता है।
SLF4J: एक इंटरफ़ेस के विरुद्ध लॉग करें
SLF4J एक facade है — आपका कोड केवल उसके Logger इंटरफ़ेस पर निर्भर है, और कोई भी backend (Logback, Log4j2) classpath से जोड़ा जा सकता है, बिना कोई log स्टेटमेंट छुए।
private static final Logger log = LoggerFactory.getLogger(OrderService.class);
void place(Order o) {
log.debug("placing order {}", o.id());
try {
repo.save(o);
log.info("order {} placed for {}", o.id(), o.customerId());
} catch (Exception e) {
log.error("failed to place order {}", o.id(), e);
}
}सही level चुनें
TRACE/DEBUG डेवलपर विवरण के लिए (प्रोड में बंद), INFO महत्वपूर्ण व्यावसायिक घटनाओं के लिए, WARN ध्यान देने योग्य पर संभालने-योग्य समस्याओं के लिए, ERROR ध्यान चाहने वाली विफलताओं के लिए। स्ट्रिंग concatenation नहीं, {} placeholder उपयोग करें — level बंद होने पर SLF4J फ़ॉर्मेटिंग छोड़ देता है।