1.1 लॉग का परिचय
लॉग उन घटनाओं की सूची है जो घटित हो चुकी हैं। लगभग एक समुद्री पत्रिका या डायरी की तरह। ठीक है, तदनुसार, एक लकड़हारा एक वस्तु है जिसके साथ आप लॉग कर सकते हैं। प्रोग्रामिंग में, लगभग हर चीज को लॉग करने की प्रथा है। और जावा में सब कुछ वैसा ही है और थोड़ा और भी।
तथ्य यह है कि जावा प्रोग्राम अक्सर यूआई, कंसोल आदि के बिना बड़े सर्वर अनुप्रयोग होते हैं। वे एक ही समय में हजारों उपयोगकर्ताओं के अनुरोधों को संसाधित करते हैं और अक्सर विभिन्न त्रुटियां होती हैं। खासतौर पर तब जब अलग-अलग धागे एक-दूसरे के साथ हस्तक्षेप करने लगें।
और, वास्तव में, ऐसी स्थिति में शायद ही कभी पुनरुत्पादित त्रुटियों और विफलताओं को खोजने का एकमात्र तरीका लॉग / फ़ाइल को लिखना है जो प्रत्येक थ्रेड में होता है।
सबसे अधिक बार, लॉग को उस विधि के मापदंडों के बारे में जानकारी लिखी जाती है जिसके साथ इसे बुलाया गया था, सभी इंटरसेप्टेड त्रुटियां और बहुत सारी मध्यवर्ती जानकारी। लॉग जितना अधिक पूर्ण होगा, घटनाओं के अनुक्रम को पुनर्स्थापित करना और विफलता या त्रुटि के कारणों का पता लगाना उतना ही आसान होगा।
लेकिन लॉग जितना बड़ा होगा, उसके साथ काम करना उतना ही मुश्किल होगा। कभी-कभी लॉग प्रति दिन कई गीगाबाइट तक पहुँच जाते हैं। यह ठीक है।
1.2 विफल लॉग
पहले लॉग के रूप में, डेवलपर्स ने केवल कंसोल पर आउटपुट का उपयोग किया । एप्लिकेशन डिबगिंग के दौरान ऐसा करना सुविधाजनक है - जब कंसोल पर सभी महत्वपूर्ण जानकारी और चर मान लिखे जाते हैं। लेकिन आवेदन के सामान्य संचालन के दौरान ऐसा लॉग पूरी तरह से अनुपयुक्त है।
सबसे पहले, एप्लिकेशन कंसोल में कुछ आउटपुट करना चाहता है, और उपयोगकर्ता प्रोग्रामर के लिए लक्षित सेवा की जानकारी बिल्कुल नहीं देखना चाहता।
दूसरे, कंसोल बफ़र का आकार सीमित है, आप वहां बहुत कुछ नहीं लिख सकते।
और अंत में, तीसरा, प्रोग्राम त्रुटियों के बारे में जानकारी जो एक लंबी अवधि में एकत्र की जाती है, प्रोग्राम डेवलपर्स को भेजी जानी चाहिए। और यह सब जानकारी एक बार में फ़ाइल में लिखना सबसे सुविधाजनक है।
डेवलपर्स ने पहली समस्या को जल्दी से हल किया - वे एक और आउटपुट स्ट्रीम के साथ आए - System.err
. आप इसे संदेश लिख सकते हैं और उन्हें एक अलग थ्रेड में भेजा जाएगा, न कि मानक कंसोल पर।
और फ़ाइल में लिखने की समस्या भी हल हो गई थी:
// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
throw new Exception("Error message");
} catch (Exception e) {
e.printStackTrace();
}
लेकिन इस रूप में भी, इसने पूरी समस्या का समाधान नहीं किया, इसलिए एक विशेष पुस्तकालय बनाने का निर्णय लिया गया जो एक फ़ाइल में लॉग संदेश लिखेगा। उसने इसे स्मार्ट तरीके से किया और लॉग किए गए ईवेंट और डेटा के लिए फ़िल्टर को कॉन्फ़िगर करने के लचीलेपन की अनुमति दी।
संपूर्ण लॉगिंग प्रक्रिया, वास्तव में, तीन भागों में होती है:
- पहला भाग सूचना एकत्र करना है ।
- दूसरा भाग एकत्रित जानकारी का फ़िल्टरिंग है।
- तीसरा भाग चयनित सूचनाओं की रिकॉर्डिंग है।
1.3 log4j लकड़हारे का परिचय
जावा समुदाय में पहला लोकप्रिय लकड़हारा log4j
. इसे प्रोजेक्ट में शामिल करना बहुत आसान है, इसके लिए आपको अपने pom.xml में बस कुछ पंक्तियां जोड़नी होंगी
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.2.17</version>
</dependency>
इस तरह के लकड़हारे के साथ आपके कार्यक्रम की बातचीत कुछ इस तरह दिखेगी:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
यहां तीन चीजें होती हैं:
वस्तु का निर्माण हरे रंग में हाइलाइट किया गया है Logger
। इसके साथ सुविधाजनक आगे के काम के लिए इसकी वस्तु को एक स्थिर चर में संग्रहीत किया जाता है। और getLogger()
जिस कक्षा में जानकारी एकत्र की जाती है उसके बारे में भी जानकारी विधि को पास की जाती है।
नीले रंग में हाइलाइट की गई रेखा वह है जहां हम केवल डिबगिंग के दौरान मूल्य की जानकारी लॉग करते हैं । इसके लिए एक विशेष विधि का प्रयोग किया जाता है -debug()
और अंत में, वह रेखा जहां हम अपवाद को सहेजते हैं जो लॉग में उत्पन्न हुआ है, लाल रंग में हाइलाइट किया गया है । अपवाद संभावित त्रुटियां हैं, इसलिए error()
.
GO TO FULL VERSION