# SLF4J व संरचित लॉगिंग — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-logging

> 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 स्टेटमेंट छुए।

```java
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 फ़ॉर्मेटिंग छोड़ देता है।
