"अरे, तू तिथे आहेस! तुला आठवतंय का की आज आम्हाला आणखी एक धडा आहे?"

"नाही, मी फक्त तुलाच शोधत होतो. जवळपास..."

"उत्तम, मग सुरुवात करूया. आज मला तुम्हाला लॉगिंगबद्दल सांगायचे आहे."

"लॉग ही घडलेल्या घटनांची यादी आहे. जवळजवळ एखाद्या जहाजाच्या लॉग किंवा डायरीप्रमाणे. किंवा Twitter - कदाचित तुम्ही त्याच्याशी अधिक चांगले संबंध ठेवू शकता. आश्चर्याची गोष्ट नाही की, लॉगर ही एक वस्तू आहे जी तुम्ही लॉगिंगसाठी वापरता."

"प्रोग्रामिंगमध्ये, जवळजवळ प्रत्येक गोष्ट लॉग करण्याची प्रथा आहे. आणि Java मध्ये, आम्ही सर्वकाही लॉग करतो आणि आणखी काही."

"खरं म्हणजे Java प्रोग्राम्स हे UI, कन्सोल इ. शिवाय बरेचदा मोठे सर्व्हर ऍप्लिकेशन्स असतात. ते एकाच वेळी हजारो वापरकर्त्यांच्या विनंत्यांवर प्रक्रिया करतात आणि अनेकदा विविध त्रुटी असतात. विशेषत: जेव्हा भिन्न थ्रेड्स एकमेकांमध्ये हस्तक्षेप करू लागतात."

"खरं तर, या परिस्थितीत क्वचितच पुनरुत्पादित दोष आणि अपयश शोधण्याचा एकमेव मार्ग म्हणजे प्रत्येक थ्रेडवर घडणाऱ्या सर्व गोष्टी लॉग करणे."

"बहुतेकदा, लॉगमध्ये मेथड आर्ग्युमेंट्स, पकडल्या गेलेल्या त्रुटी आणि बरीच इंटरमीडिएट माहिती असते."

"लॉग जितका पूर्ण होईल तितके इव्हेंट्सचा क्रम पुनरुत्पादित करणे आणि अपयश किंवा बगच्या कारणांचा मागोवा घेणे सोपे आहे."

"कधीकधी लॉग दररोज अनेक गीगाबाइट्सपर्यंत पोहोचतात. हे सामान्य आहे."

"काही गीगाबाइट्स? ओ_ओ"

"हो. बर्‍याचदा, लॉग फाइल्स आपोआप संग्रहित केल्या जातात, संबंधित तारखेच्या संकेताने."

"व्वा."

"उह-हह. सुरुवातीला, जावाकडे स्वतःचे लॉगर नव्हते. परिणामी, अनेक स्वतंत्र लॉगर लिहिले गेले. यापैकी सर्वात सामान्य लॉग 4j होते."

"काही वर्षांनंतर, जावाला स्वतःचा एक लॉगर मिळाला, परंतु त्याची कार्यक्षमता खूपच निकृष्ट होती आणि ती मोठ्या प्रमाणावर वापरली जात नव्हती."

"हे खरं आहे की Java मध्ये अधिकृत लॉगर आहे, परंतु Java प्रोग्रामरचा संपूर्ण समुदाय इतर लॉगर वापरण्यास प्राधान्य देतो. "

"नंतर, log4j वर आधारित आणखी बरेच लॉगर लिहिले गेले."

"मग विशेष युनिव्हर्सल लॉगर slf4j, जो आता मोठ्या प्रमाणावर वापरला जातो, त्या सर्वांसाठी लिहिला गेला. तो log4j सारखाच आहे, म्हणून मी लॉगिंगचे स्पष्टीकरण देताना ते उदाहरण म्हणून वापरेन."

"संपूर्ण लॉगिंग प्रक्रियेत तीन भाग असतात."

" प्रथम , माहिती गोळा करा."

" दुसरे , गोळा केलेली माहिती फिल्टर करा."

" तिसरे , निवडलेली माहिती रेकॉर्ड करा."

"चला संकलनापासून सुरुवात करूया. येथे लॉग केलेल्या वर्गाचे एक सामान्य उदाहरण आहे:"

लॉगिंगसह वर्ग
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.compleate();
   return true;
  }
  catch(Exception e)
  {
   logger.error("Unknown error", e);
   return false;
  }
 }
}

"लाल रंगात हायलाइट केलेल्या शब्दांकडे लक्ष द्या."

" ओळ 3  - लॉगर ऑब्जेक्ट तयार करा. असा स्थिर ऑब्जेक्ट जवळजवळ प्रत्येक वर्गात तयार केला जातो! बरं, डेटा संग्रहित करण्याशिवाय इतर काहीही करत नसलेल्या वर्गांशिवाय."

" लॉगरफॅक्टरी हा लॉगर तयार करण्यासाठी एक विशेष वर्ग आहे आणि गेटलॉगर ही त्याच्या स्थिर पद्धतींपैकी एक आहे. वर्तमान ऑब्जेक्ट सहसा पास केले जाते, परंतु विविध पर्याय शक्य आहेत."

" ओळ 7 - मेथड कॉलबद्दल माहिती लॉगरला लिहिली जाते. लक्षात घ्या की ही पद्धतची पहिली ओळ आहे. मेथड कॉल करताच, आम्ही लगेच लॉगवर माहिती लिहितो."

"आम्ही डीबग पद्धत म्हणतो, याचा अर्थ माहितीचे महत्त्व डीबग पातळी आहे. हे फिल्टरिंगसाठी वापरले जाते. मी तुम्हाला त्याबद्दल काही मिनिटांत सांगेन."

" ओळ 17 - आम्ही एक अपवाद पकडतो आणि... लगेच लॉगमध्ये लिहितो! नेमके हेच करणे आवश्यक आहे."

"या वेळी आम्ही त्रुटी पद्धत कॉल करतो, जी लगेच सूचित करते की माहिती ERROR पातळी आहे"

लॉगर - १

"सगळं आत्तापर्यंत स्पष्ट दिसतंय. बरं, आमच्या संभाषणाच्या मध्यभागी ते स्पष्ट होऊ शकतं."

"छान, मग आपण संदेश फिल्टरिंगकडे वळूया."

"सामान्यतः, प्रत्येक लॉग संदेशाची स्वतःची महत्त्वाची पातळी असते, ज्याचा वापर तुम्ही काही संदेश टाकून देण्यासाठी करू शकता. मी नमूद केलेल्या महत्त्वाच्या पातळी येथे आहेत:"

महत्त्व पातळी वर्णन
सर्व सर्व संदेश
ट्रेस सूक्ष्म डीबग संदेश
डीबग करा महत्त्वाचे डीबग संदेश
माहिती माहितीपूर्ण संदेश
चेतावणी द्या इशारे
एरर चुका
घातक घातक चुका
बंद कोणतेही संदेश नाहीत

हे स्तर संदेश फिल्टर करताना देखील वापरले जातात.

समजा तुम्ही लॉगिंग लेव्हल WARN वर सेट केले आहे. नंतर चेतावणी पेक्षा कमी महत्वाचे असलेले सर्व संदेश टाकून दिले जातील: TRACE, DEBUG, INFO.

तुम्ही फिल्टरिंग लेव्हल FATAL वर सेट केल्यास, ERROR मेसेज देखील टाकून दिले जातील.

"फिल्टर करताना आणखी दोन महत्त्वाचे स्तर वापरले जातात: बंद, जे सर्व संदेश टाकून देतात; आणि सर्व, जे सर्व संदेश दर्शवितात (काहीही टाकले जात नाही)."

"मी फिल्टरिंग कसे आणि कुठे सेट करू?"

"मी तुम्हाला पुढची अडचण न करता सांगेन."

"सामान्यतः, log4j लॉगर सेटिंग्ज log4j.properties फाइलमध्ये निर्दिष्ट केल्या जातात."

तुम्ही या फाईलमध्ये एकापेक्षा जास्त ऍपेंडर ऑब्जेक्ट्स निर्दिष्ट करू शकता. या वस्तूंवर डेटा लिहिला जातो. डेटा स्रोत आहेत, आणि परिशिष्ट आहेत - वस्तू ज्यांचे विरुद्ध हेतू आहेत. ज्या वस्तूंमध्ये डेटा पाण्यासारखा प्रवाहित होतो.

"येथे काही उदाहरणे आहेत:"

कन्सोलवर लॉग इन करत आहे
# Root logger option
log4j.rootLogger = INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

ओळी 1 आणि 4 - या टिप्पण्या आहेत

ओळ 2 - आम्ही इच्छित लॉगिंग पातळी सूचित करतो. सर्व कमी महत्त्वाचे स्तर (DEBUG, TRACE) टाकून दिले जातील.

त्याच ठिकाणी, आम्ही एक स्वल्पविराम जोडतो आणि नंतर ऑब्जेक्टचे नाव सूचित करतो (जे आपण स्वतःसह येतो) ज्यावर लॉग लिहिला जाईल. ओळी 5-9 मध्ये त्याची सेटिंग्ज आहेत.

ओळ 5 - आम्ही ऍपेंडरचा प्रकार निर्दिष्ट करतो ( कन्सोल ऍपेंडर ).

ओळ 6 - आम्ही नेमके कुठे लिहित आहोत ते आम्ही सूचित करतो ( System.out. ).

ओळ 7 - आम्ही वर्ग सेट करतो जो रूपांतरण पॅटर्न (पॅटर्न लेआउट) व्यवस्थापित करेल.

ओळ 8 - आम्ही रूपांतरण नमुना सेट करतो जो लेखनासाठी वापरला जाईल. वरील उदाहरणात, ती तारीख आणि वेळ आहे.

"आणि फाईलवर लिहिणे असे दिसते:"

फाईलवर लॉग इन करत आहे
# Root logger option
log4j.rootLogger = INFO, file

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

"ओळ 2 संदेश फिल्टरिंग पातळी आणि ऍपेंडर ऑब्जेक्टचे नाव (सिंक) सेट करते."

"ओळ 5 - आम्ही फाईल ऍपेंडर प्रकार निर्दिष्ट करतो ( RollingFileAppender )."

"ओळ 6 - आम्ही फाइलचे नाव निर्दिष्ट करतो ज्यावर लॉग लिहिला जाईल."

"ओळ 7 - आम्ही जास्तीत जास्त लॉग आकार निर्दिष्ट करतो. जेव्हा ही आकार मर्यादा ओलांडली जाते, तेव्हा एक नवीन फाइल तयार केली जाते."

"ओळ 8 - आम्ही संग्रहित करायच्या जुन्या लॉग फाइल्सची संख्या निर्दिष्ट करतो."

"9-10 ओळी - रूपांतरण नमुना सेट करा."

"येथे काय चालले आहे हे मला माहीत नाही, पण मी अंदाज लावू शकतो. ते उत्साहवर्धक आहे."

"हे छान आहे. मग फाईल आणि कन्सोलवर लॉग कसा लिहायचा याचे एक उदाहरण येथे आहे:"

कन्सोल आणि फाइलवर लॉग इन करत आहे
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

"अहो, तर तुम्ही ते करू शकता? ते छान आहे!"

"हो. तुम्ही तुम्हाला हवे तितके परिशिष्ट घोषित करू शकता आणि प्रत्येकाला सानुकूलित करू शकता."

शिवाय, प्रत्येक परिशिष्टात संदेश फिल्टरिंगसाठी अतिशय लवचिक सेटिंग्ज असू शकतात. आम्ही प्रत्येक परिशिष्टाला वैयक्तिक संदेश फिल्टरिंग स्तर नियुक्त करू शकत नाही, परंतु आम्ही पॅकेजद्वारे संदेश फिल्टर देखील करू शकतो! म्हणूनच लॉगर तयार करताना तुम्हाला एक वर्ग निर्दिष्ट करणे आवश्यक आहे (मी LoggerFactory.getLogger बद्दल बोलत आहे ).

"उदाहरणार्थ:"

कन्सोल आणि फाइलवर लॉग इन करत आहे
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.threshold = DEBUG
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold = ERROR
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

log4j.logger.org.springframework = ERROR
log4j.logger.org.hibernate = ERROR
log4j.logger.com.codegym = DEBUG
log4j.logger.org.apache.cxf = ERROR

"6 आणि 15 ओळी - आम्ही प्रत्येक परिशिष्टासाठी आमची स्वतःची फिल्टरिंग पातळी सेट करतो."

"ओळी 20-23 - आम्ही पॅकेजचे नाव आणि त्याच्या संदेशांसाठी फिल्टरिंग स्तर निर्दिष्ट करतो. Log4j.logger हा उपसर्ग आहे: पॅकेजचे नाव नारंगी रंगात हायलाइट केले आहे."

"खरंच? तू असंही करू शकतोस. बरं, मस्त!"

"तसे, JDK मध्ये log4j किंवा slf4j दोन्ही समाविष्ट नाहीत. तुम्हाला ते स्वतंत्रपणे डाउनलोड करावे लागतील. तुम्ही ते येथे करू शकता . पण दुसरा मार्ग आहे:"

" पायरी 1 .वर्गात आयात जोडा:"

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

" चरण 2. या ओळींवर कर्सर ठेवा आणि IntelliJ IDEA मध्ये Alt+Enter दाबा"

" पायरी 3. 'वेबवर फाइल जार» मेनू आयटम निवडा.

" चरण 4. 'slf4j-log4j13.jar' निवडा"

" पायरी 5. लायब्ररी (जार) कुठे डाउनलोड करायची ते निर्दिष्ट करा"

" चरण 6. तुम्हाला आवश्यक असलेले वर्ग वापरा."

"अरे! हा काय दिवस गेला. खूप नवीन आहे आणि खूप छान आहे!"

"लॉगिंगवर हा आणखी एक चांगला लेख आहे: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"ठीक आहे, पुरे झाले. जा आराम कर, प्रोग्रामर."