CodeGym /جاوا بلاگ /Random-UR /جاوا لاگنگ
John Squirrels
سطح
San Francisco

جاوا لاگنگ

گروپ میں شائع ہوا۔
ہائے! اسباق لکھتے وقت، میں خاص طور پر اس بات پر زور دیتا ہوں کہ کیا کوئی خاص موضوع ہے جو حقیقی کام میں بالکل ضروری ہوگا۔ تو، سنو! آج ہم جس موضوع کا احاطہ کریں گے وہ یقینی طور پر ملازمت کے پہلے دن سے آپ کے تمام منصوبوں میں کام آئے گا۔ ہم جاوا لاگنگ کے بارے میں بات کرنے جا رہے ہیں۔ یہ موضوع بالکل بھی پیچیدہ نہیں ہے (میں آسان بھی کہوں گا)۔ لیکن آپ کے پاس اپنی پہلی ملازمت پر دباؤ ڈالنے کے لیے کافی واضح چیزیں ہوں گی، اس لیے بہتر ہے کہ اسے ابھی اچھی طرح سمجھ لیا جائے :) ٹھیک ہے، آئیے شروع کرتے ہیں۔

جاوا میں لاگ ان کیا ہے؟

لاگنگ کسی پروگرام کے آپریشن کے بارے میں ڈیٹا ریکارڈ کرنے کا عمل ہے۔ وہ جگہ جہاں ہم اس ڈیٹا کو ریکارڈ کرتے ہیں اسے "لاگ" کہا جاتا ہے۔ دو سوالات فوری طور پر پیدا ہوتے ہیں: کیا ڈیٹا لکھا گیا ہے اور کہاں؟ آئیے "جہاں" سے شروع کرتے ہیں۔ آپ کسی پروگرام کے کام کے بارے میں ڈیٹا کو مختلف جگہوں پر لکھ سکتے ہیں۔ مثال کے طور پر، آپ کی پڑھائی کے دوران، آپ اکثر System.out.println()کنسول میں ڈیٹا آؤٹ پٹ کرنے کے لیے۔ یہ واقعی لاگنگ ہے، اگرچہ اس کی سب سے آسان شکل میں ہے۔ یقیناً، یہ صارفین یا پروڈکٹ سپورٹ ٹیم کے لیے زیادہ آسان نہیں ہے: ظاہر ہے، وہ IDE انسٹال نہیں کرنا چاہیں گے اور کنسول کی نگرانی نہیں کریں گے :) معلومات کو ریکارڈ کرنے کے لیے ایک زیادہ روایتی فارمیٹ ہے: ٹیکسٹ فائلز۔ انسان اس فارمیٹ میں ڈیٹا پڑھنے میں بہت زیادہ آرام دہ ہیں، اور یقینی طور پر ڈیٹا کو اسٹور کرنے کے لیے یہ بہت زیادہ آسان ہے! اب دوسرا سوال: کس پروگرام کے ڈیٹا کو لاگ کرنا چاہیے؟ یہ مکمل طور پر آپ پر منحصر ہے! جاوا کا لاگنگ سسٹم بہت لچکدار ہے۔ آپ اسے ہر اس چیز کو لاگ ان کرنے کے لیے تشکیل دے سکتے ہیں جو آپ کا پروگرام کرتا ہے۔ ایک طرف، یہ اچھا ہے. لیکن دوسری طرف، تصور کریں کہ فیس بک یا ٹویٹر کے لاگز کتنے بڑے ہوں گے اگر وہ ان میں سب کچھ لکھ دیں۔ یہ بڑی کمپنیاں شاید اتنا ڈیٹا ذخیرہ کرنے کی صلاحیت رکھتی ہیں۔ لیکن تصور کریں کہ 500 گیگا بائٹس ٹیکسٹ لاگ میں ایک اہم غلطی کے بارے میں معلومات حاصل کرنا کتنا مشکل ہو گا؟ یہ گھاس کے ڈھیر میں سوئی تلاش کرنے سے بھی بدتر ہو گا۔ اس کے مطابق، جاوا کو صرف غلطی کے ڈیٹا کو لاگ کرنے کے لیے کنفیگر کیا جا سکتا ہے۔ یا یہاں تک کہ صرف اہم غلطیاں! اس نے کہا، جاوا کے مقامی لاگنگ سسٹم کے بارے میں بات کرنا مکمل طور پر درست نہیں ہے۔ حقیقت یہ ہے کہ پروگرامرز کو زبان میں اس فعالیت کو شامل کرنے سے پہلے لاگنگ کی ضرورت تھی۔ جب تک جاوا نے اپنی لاگنگ لائبریری متعارف کرائی، ہر کوئی پہلے سے ہی log4j لائبریری استعمال کر رہا تھا۔ جاوا میں لاگ ان کرنے کی تاریخ دراصل بہت طویل اور معلوماتی ہے۔ مختصراً، جاوا کی اپنی لاگنگ لائبریری ہے، لیکن تقریباً کوئی بھی اسے استعمال نہیں کرتا :) بعد میں، جب کئی مختلف لاگنگ لائبریریاں نمودار ہوئیں اور پروگرامرز کے ذریعہ استعمال ہونے لگیں، تو مطابقت کے مسائل پیدا ہوئے۔ لوگوں کو مختلف انٹرفیس کے ساتھ درجن بھر مختلف لائبریریوں میں پہیے کو دوبارہ ایجاد کرنے سے روکنے کے لیے، خلاصہ SLF4J فریم ورک ("Service Logging Facade For Java") بنایا گیا تھا۔ اسے خلاصہ کہا جاتا ہے، کیونکہ یہاں تک کہ اگر آپ SLF4J کلاسز کے طریقوں کو استعمال اور کال کرتے ہیں، تو وہ اصل میں لاگنگ کے تمام فریم ورک استعمال کرتے ہیں جو پہلے آئے تھے: log4j، معیاری java.util.logging، اور دیگر۔ اگر کسی موقع پر آپ کو Log4j کی کسی خاص خصوصیت کی ضرورت ہو جو دوسری لائبریریوں میں نہ ہو، لیکن آپ اپنے پروجیکٹ کو براہ راست اس لائبریری سے جوڑنا نہیں چاہتے، تو صرف SLF4J استعمال کریں۔ اور پھر اسے Log4j طریقوں کو کال کرنے دیں۔ اگر آپ اپنا خیال بدلتے ہیں اور فیصلہ کرتے ہیں کہ آپ کو Log4j خصوصیات کی مزید ضرورت نہیں ہے، تو آپ کو دوسری لائبریری استعمال کرنے کے لیے صرف "ریپر" (یعنی SLF4J) کو دوبارہ ترتیب دینے کی ضرورت ہے۔ آپ کا کوڈ کام کرنا بند نہیں کرے گا، کیونکہ آپ SLF4J طریقوں کو کال کر رہے ہیں، نہ کہ کسی مخصوص لائبریری کو۔ ایک چھوٹا سا اختلاف۔ درج ذیل مثالوں کے کام کرنے کے لیے، آپ کو یہاں SLF4J لائبریری ، اور Log4j لائبریری کو یہاں ڈاؤن لوڈ کرنے کی ضرورت ہے۔ . اگلا، آرکائیو کو کھولیں اور کلاس پاتھ میں JAR فائلوں کو شامل کرنے کے لیے IntelliJ IDEA کا استعمال کریں۔ مینو آئٹمز: فائل -> پروجیکٹ کا ڈھانچہ -> لائبریریاں ضروری JAR فائلوں کو منتخب کریں اور انہیں پروجیکٹ میں شامل کریں (ہم نے جو آرکائیوز ڈاؤن لوڈ کیے ہیں ان میں بہت سی JAR فائلیں ہیں - تصاویر کو دیکھیں جن کی آپ کو ضرورت ہے) نوٹ کریں کہ یہ ہدایت ان طلباء کے لیے ہے ہمیں لاگنگ کی ضرورت کیوں ہے - 2ہمیں لاگنگ کی ضرورت کیوں ہے - 3۔ جو ماون کو استعمال کرنا نہیں جانتے۔ اگر آپ Maven کو استعمال کرنا جانتے ہیں، تو وہاں سے شروع کرنے کی کوشش کرنا عام طور پر بہتر (بہت آسان) ہوتا ہے۔ اگر آپ استعمال کرتے ہیں Maven ، تو یہ انحصار شامل کریں:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
زبردست! ہم نے ترتیبات کا پتہ لگایا :) آئیے دیکھتے ہیں کہ SLF4J کیسے کام کرتا ہے۔ ہم یہ کیسے یقینی بناتے ہیں کہ پروگرام کا کام کہیں ریکارڈ کیا گیا ہے؟ ایسا کرنے کے لیے ہمیں دو چیزوں کی ضرورت ہے: لاگر اور اپینڈر۔ آئیے پہلے سے شروع کرتے ہیں۔ لاگر ایک ایسی چیز ہے جو لاگنگ کا مکمل کنٹرول فراہم کرتی ہے۔ لاگر بنانا بہت آسان ہے: ہم یہ کام static LoggerFactory.getLogger() طریقوں سے کرتے ہیں۔ طریقہ پیرامیٹر وہ کلاس ہے جس کا آپریشن لاگ ان ہوگا۔ آئیے اپنا کوڈ چلائیں:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
کنسول آؤٹ پٹ:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
ہم یہاں کیا دیکھتے ہیں؟ سب سے پہلے، ہم ایک غلطی کا پیغام دیکھتے ہیں. یہ اس حقیقت کا نتیجہ ہے کہ اب ہمارے پاس ضروری ترتیبات کی کمی ہے۔ اس کے مطابق، ہمارا لاگر فی الحال صرف غلطی کے پیغامات (ERROR) اور صرف کنسول کو آؤٹ پٹ کرنے کے قابل ہے۔ logger.info () طریقہ کارگر نہیں ہوا۔ لیکن logger.error() نے کیا! کنسول پر، ہم موجودہ تاریخ، وہ طریقہ دیکھتے ہیں جہاں غلطی ہوئی تھی ( main )، لفظ "ERROR"، اور ہمارا پیغام! ERROR لاگنگ کی سطح ہے۔ عام طور پر، اگر لاگ انٹری کو لفظ "ERROR" کے ساتھ نشان زد کیا گیا ہے، تو پروگرام میں اس مقام پر ایک خرابی واقع ہوئی ہے۔ اگر اندراج کو لفظ "INFO" کے ساتھ نشان زد کیا گیا ہے، تو پیغام صرف پروگرام کے عام آپریشن کے بارے میں موجودہ معلومات کی نمائندگی کرتا ہے۔ SLF4J لائبریری میں لاگنگ کی بہت سی مختلف سطحیں ہیں جو آپ کو لاگنگ کو لچکدار طریقے سے ترتیب دینے دیتی ہیں۔ یہ سب انتظام کرنا بہت آسان ہے: تمام ضروری منطق پہلے سے جاوا لاگر کلاس میں موجود ہے۔ آپ کو صرف متعلقہ طریقوں کو کال کرنے کی ضرورت ہے۔ اگر آپ روٹین میسج لاگ کرنا چاہتے ہیں تو logger.info() طریقہ پر کال کریں۔ غلطی کے پیغام کے لیے، logger.error() استعمال کریں ۔ انتباہ کے لیے، logger.warn() استعمال کریں

اب ہم ضمیمہ کے بارے میں بات کرتے ہیں

اپینڈر وہ جگہ ہے جہاں آپ کا ڈیٹا جاتا ہے۔ ایک طرح سے، ڈیٹا سورس کے برعکس، یعنی "پوائنٹ B"۔ پہلے سے طے شدہ طور پر، ڈیٹا کنسول میں آؤٹ پٹ ہوتا ہے۔ نوٹ کریں کہ پچھلی مثال میں ہمیں کچھ بھی ترتیب دینے کی ضرورت نہیں تھی: متن کنسول میں ظاہر ہوا، اور Log4j لائبریری کا لاگر کنسول میں صرف ERROR سطح کے پیغامات ہی آؤٹ پٹ کر سکتا ہے۔ ظاہر ہے، لوگوں کے لیے ٹیکسٹ فائل میں لاگ پڑھنا اور لکھنا زیادہ آسان ہے۔ لاگر کے ڈیفالٹ رویے کو تبدیل کرنے کے لیے، ہمیں اپنے فائل اپینڈر کو کنفیگر کرنے کی ضرورت ہے۔ شروع کرنے کے لیے، آپ کو براہ راست src فولڈر میں log4j.xml فائل بنانے کی ضرورت ہے۔ آپ XML فارمیٹ سے پہلے ہی واقف ہیں: ہم نے حال ہی میں اس کے بارے میں ایک سبق لیا تھا :) فائل کے مندرجات یہ ہیں:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
یہاں کچھ خاص یا مشکل نہیں ہے :) لیکن پھر بھی، آئیے مواد کو دیکھتے ہیں۔
<Configuration status="INFO">
یہ نام نہاد StatusLogger ہے۔ یہ ہمارے لاگر سے غیر متعلق ہے اور Log4j کے اندرونی عمل میں استعمال ہوتا ہے۔ اگر آپ status="INFO" کے بجائے status="TRACE" سیٹ کرتے ہیں، اور Log4j کے اندرونی کام کے بارے میں تمام معلومات کنسول پر ظاہر ہوں گی (StatusLogger کنسول پر ڈیٹا دکھاتا ہے، چاہے ہمارا ضمیمہ فائل ہی کیوں نہ ہو)۔ ہمیں اب اس کی ضرورت نہیں ہے، تو آئیے اسے ویسے ہی چھوڑ دیں۔
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
یہاں ہم اپنا اپینڈر بناتے ہیں۔ < فائل> ٹیگ اشارہ کرتا ہے کہ یہ فائل اپینڈر ہوگا۔ name="MyFileAppender" اپینڈر کا نام سیٹ کرتا ہے۔ fileName="C:\Users\Username\Desktop\testlog.txt" لاگ فائل کے راستے کی نشاندہی کرتا ہے جہاں تمام ڈیٹا لکھا جائے گا۔ append="true" اشارہ کرتا ہے کہ آیا ڈیٹا کو فائل کے آخر میں لکھا جانا چاہیے۔ ہمارے معاملے میں، یہ بالکل وہی ہے جو ہم کریں گے۔ اگر آپ نے ویلیو کو غلط پر سیٹ کیا تو لاگ فائل کے پرانے مواد ہر بار پروگرام شروع ہونے پر حذف ہو جائیں گے۔ <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> فارمیٹنگ کی ترتیبات کی نشاندہی کرتا ہے ۔ یہاں ہم ریگولر ایکسپریشنز کو اپنی مرضی کے مطابق بنانے کے لیے استعمال کر سکتے ہیں کہ ہمارے لاگ میں ٹیکسٹ کو کیسے فارمیٹ کیا جاتا ہے۔
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
یہاں ہم جڑ کی سطح کی نشاندہی کرتے ہیں۔ ہم نے "INFO" کی سطح مقرر کی ہے، جس کا مطلب ہے کہ تمام پیغامات جن کی سطح INFO سے زیادہ ہے (اس ٹیبل کے مطابق جسے ہم نے اوپر دیکھا ہے) لاگ ان نہیں ہوں گے۔ ہمارے پروگرام میں 3 پیغامات ہوں گے: ایک INFO، ایک انتباہ اور ایک ERROR۔ موجودہ ترتیب کے ساتھ، تمام 3 پیغامات لاگ ان ہوں گے۔ اگر آپ روٹ لیول کو ERROR میں تبدیل کرتے ہیں، تو LOGGER.error() میتھڈ کال کا صرف آخری پیغام لاگ میں ختم ہوگا۔ مزید برآں، ضمیمہ کا حوالہ بھی یہاں جاتا ہے۔ اس طرح کا حوالہ بنانے کے لیے، آپ کو <Root> ٹیگ کے اندر ایک <ApprenderRef> ٹیگ بنانا ہوگا اور اس میں ref='your appender's name' وصف شامل کرنا ہوگا۔ اگر آپ بھول گئے ہیں تو، یہ وہ جگہ ہے جہاں ہم ضمیمہ کرنے والے کا نام سیٹ کرتے ہیں: <File name="MyFileAppender" ۔ اور یہاں ہمارا کوڈ ہے!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
بلاشبہ، یہ تھوڑا سا ناگوار ہے (RuntimeException کو پکڑنا ایک قابل اعتراض خیال ہے)، لیکن یہ ہمارے مقاصد کے لیے بہترین ہے :) آئیے اپنا main() طریقہ لگاتار 4 بار چلائیں اور اپنی testlog.txt فائل کو دیکھیں۔ آپ کو اسے پہلے سے بنانے کی ضرورت نہیں ہے: لائبریری یہ خود بخود کرے گی۔ سب کچھ کام کیا! :) اب آپ کے پاس کنفیگرڈ لاگر ہے۔ آپ اپنے کچھ پرانے پروگراموں کے ساتھ کھیل سکتے ہیں، ہر طریقہ میں لاگر کالز شامل کر سکتے ہیں۔ پھر نتیجے میں لاگ کو دیکھیں :) یہ گہرائی میں لاگنگ کے موضوع پر غور کرتا ہے۔ یہ سب ایک ہی نشست میں پڑھنا مشکل ہوگا۔ اس نے کہا، اس میں بہت سی اضافی مفید معلومات شامل ہیں۔ مثال کے طور پر، آپ لوگر کو کنفیگر کرنے کا طریقہ سیکھیں گے تاکہ اگر ہماری testlog.txt فائل ایک خاص سائز تک پہنچ جائے تو یہ ایک نئی ٹیکسٹ فائل بناتا ہے :) اور اس سے ہماری کلاس ختم ہوتی ہے! آج آپ ایک بہت ہی اہم موضوع سے واقف ہوئے، اور یہ علم یقیناً آپ کے مستقبل کے کام میں مددگار ثابت ہوگا۔ اگلے وقت تک! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION