Parameterized Logging
संदेशों का कुशल फ़ॉर्मैटिंग
Parameterized Logging, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
स्ट्रिंग जोड़ने की समस्या
लॉग संदेश को जोड़ने पर पूरा स्ट्रिंग पहले ही बन जाता है, भले ही वह स्तर बंद हो।
log.debug("id=" + id + " name=" + name) में DEBUG बंद होने पर CPU व्यर्थ होता है, क्योंकि स्ट्रिंग फिर भी बनती है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String name = "Ada"; int id = 7;
// Bad: string is built even if DEBUG is disabled
log.debug("id=" + id + " name=" + name);
}
}{} के साथ प्लेसहोल्डर
SLF4J {} को प्लेसहोल्डर के रूप में उपयोग करता है। मानों को अतिरिक्त तर्कों के रूप में पास करें।
संदेश केवल तभी जोड़ा जाता है जब स्तर सक्रिय हो, इसलिए बंद लॉग की लागत लगभग शून्य होती है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String name = "Ada"; int id = 7;
// Good: no string built unless DEBUG is on
log.debug("id={} name={}", id, name);
}
}एकाधिक प्लेसहोल्डर
प्लेसहोल्डर क्रम से भरे जाते हैं। पहला {} पहला तर्क लेता है, दूसरा दूसरा तर्क लेता है, और इसी तरह आगे।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("order {} for user {} totaling {} cents", "A-1", 42, 1599);
}
}यह कुशल क्यों है
फ़्रेमवर्क पहले स्तर की जाँच करता है। यदि वह बंद हो, तो किसी भी तर्क पर toString() चलाए बिना तुरंत लौट जाता है।
महँगा काम—फ़ॉर्मैटिंग—केवल तभी विलंबित रूप से होता है जब संदेश वास्तव में भेजा जाना हो।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
static String describe(Object o) { System.out.println("toString called"); return o.toString(); }
public static void main(String[] args) {
// Note: passing describe(...) still evaluates eagerly; pass the raw object instead
log.trace("value={}", new int[]{1, 2, 3});
}
}पहले से फ़ॉर्मैट की गई स्ट्रिंग के बजाय कच्ची ऑब्जेक्ट पास करें
विलंबित निष्पादन का लाभ लेने के लिए उस विधि-कॉल के बजाय कच्ची ऑब्जेक्ट पास करें जो उसे फ़ॉर्मैट करती है।
यदि आप log.debug("{}", buildReport()) लिखते हैं, तो buildReport() फिर भी तुरंत चल जाता है। ऐसे तर्क पास करें जिन्हें लॉगर स्वयं फ़ॉर्मैट कर सके।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
Object user = new Object();
// Logger calls user.toString() only if DEBUG is enabled
log.debug("current user: {}", user);
}
}भारी काम के लिए लेज़ी सप्लायर
जब फ़ॉर्मैटिंग वास्तव में महँगी हो, तो काम को टालने के लिए Supplier के साथ SLF4J 2.x के फ्लुएंट API का उपयोग करें।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
static String heavyReport() { return "...expensive..."; }
public static void main(String[] args) {
log.atDebug()
.setMessage("report: {}")
.addArgument(() -> heavyReport())
.log();
}
}शाब्दिक ब्रेस को एस्केप करना
यदि संदेश में शाब्दिक {} चाहिए, तो उसे बैकस्लैश से एस्केप करें: \\{}।
ऐसा कम ही आवश्यक होता है, लेकिन JSON जैसे पाठ को लॉग करते समय उपयोगी है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Logs a literal {} then the value
log.info("empty object is \\{} and id is {}", 7);
}
}अपवाद और प्लेसहोल्डर
आप प्लेसहोल्डर को अंत में दिए गए अपवाद के साथ जोड़ सकते हैं। SLF4J पहचान लेता है कि अंतिम तर्क Throwable है और उसका स्टैक ट्रेस प्रिंट करता है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
int id = 99;
try {
throw new RuntimeException("db down");
} catch (Exception e) {
log.error("failed processing record {}", id, e);
}
}
}बहुत अधिक तर्कों से बचें
यदि प्लेसहोल्डरों की संख्या और तर्कों की संख्या मेल नहीं खाती, तो SLF4J अपनी ओर से सर्वोत्तम प्रयास करता है, लेकिन परिणाम गलत दिखाई दे सकता है।
दोनों की संख्या समान रखें। दो-एक से अधिक मानों के लिए इसके बजाय संरचित संदर्भ (MDC) अपनाने पर विचार करें।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Two placeholders, two arguments: correct
log.info("user {} did {}", "ada", "login");
}
}MDC के साथ संदर्भ जोड़ना
कई पंक्तियों में साझा किए जाने वाले मानों (जैसे अनुरोध आईडी) को हर संदेश में लिखने के बजाय MDC में रखें।
इसके बाद पैटर्न लेआउट हर पंक्ति में MDC का मान अपने-आप प्रिंट कर सकता है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
MDC.put("requestId", "req-1234");
try {
log.info("handling request");
log.info("request done");
} finally {
MDC.clear();
}
}
}सर्वोत्तम अभ्यासों का सारांश
कुशल लॉगिंग के नियम:
- हमेशा
{}प्लेसहोल्डर का उपयोग करें, कभी+से स्ट्रिंग न जोड़ें। - पहले से बनाई गई स्ट्रिंग के बजाय कच्ची ऑब्जेक्ट पास करें।
- वास्तव में भारी काम के लिए सप्लायर या
isXEnabled()का उपयोग करें। - हर जगह लागू होने वाले संदर्भ के लिए MDC का उपयोग करें।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("processed {} items in {} ms", 1000, 42);
}
}त्वरित जाँच
पैरामीटरयुक्त लॉगिंग के अपने ज्ञान की जाँच करें।
पुनरावलोकन
आपने पैरामीटरयुक्त लॉगिंग के बारे में जाना:
- अतिरिक्त तर्कों के साथ
{}प्लेसहोल्डर का उपयोग करें। - संदेश विलंबित रूप से बनते हैं, केवल तभी जब स्तर चालू हो।
- कच्ची ऑब्जेक्ट पास करें; भारी काम के लिए सप्लायर का उपयोग करें।
- साझा संदर्भ मानों के लिए MDC का उपयोग करें।
अगला विषय लॉगबैक बैकएंड का कॉन्फ़िगरेशन है।
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Parameterized logging recap: {}", "done");
}
}एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Parameterized Logging” पाठ निःशुल्क है?
हाँ—“Parameterized Logging” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Parameterized Logging” में मैं क्या सीखूँगा?
संदेशों का कुशल फ़ॉर्मैटिंग आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Parameterized Logging” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Structured Logging क्यों
- SLF4J Facade और Loggers
- Parameterized Logging
- Logback कॉन्फ़िगर करना