ہیلو! لیکچر لکھتے وقت، میں خاص طور پر نوٹ کرتا ہوں کہ آیا کوئی خاص موضوع یقینی طور پر حقیقی کام میں استعمال ہوگا۔
تو، توجہ! آج ہم جس موضوع پر بات کریں گے وہ یقیناً آپ کے کام کے پہلے دن سے آپ کے تمام پروجیکٹس پر کارآمد ہوگا۔ ہم لاگنگ کے بارے میں بات کریں گے۔ یہ موضوع بالکل مشکل نہیں ہے (میں آسان بھی کہوں گا)۔ لیکن آپ کی پہلی نوکری پر پہلے سے ہی واضح چیزوں سے نمٹنے کے لیے کافی تناؤ ہو گا، اس لیے بہتر ہے کہ اب اسے اچھی طرح سے حل کر لیا جائے :) تو، آئیے شروع کرتے ہیں۔ لاگنگ کیا ہے؟ لاگنگ کسی پروگرام کے آپریشن کے بارے میں کہیں ڈیٹا ریکارڈ کرنا ہے۔ وہ جگہ جہاں یہ ڈیٹا لکھا جاتا ہے اسے " لاگ " کہا جاتا ہے۔ ایک ساتھ دو سوال اٹھتے ہیں: کہاں اور کون سا ڈیٹا ریکارڈ کیا جاتا ہے؟ آئیے "کہاں" سے شروع کرتے ہیں۔ آپ بہت سے مختلف مقامات پر پروگرام کے آپریشن کا ڈیٹا ریکارڈ کر سکتے ہیں۔ مثال کے طور پر، اپنی پڑھائی کے دوران آپ اکثر استعمال کر کے کنسول میں ڈیٹا آؤٹ پٹ کرتے ہیں ![آپ کو لاگنگ کی ضرورت کیوں ہے - 2]()
نوٹ - یہ ہدایت ان لوگوں کے لیے ہے طلباء جو ماون کو استعمال کرنا نہیں جانتے ہیں۔ اگر آپ جانتے ہیں کہ اسے کیسے استعمال کرنا ہے، تو اس سے شروع کرنے کی کوشش کرنا بہتر ہے: یہ عام طور پر بہت آسان ہوتا ہے۔ اگر آپ Maven استعمال کرتے ہیں ، تو یہ انحصار شامل کریں:
System.out.println()
۔ یہ اصلی لاگنگ ہے، اگرچہ سب سے آسان ہے۔ بلاشبہ، یہ کلائنٹ یا پروڈکٹ سپورٹ ٹیم کے لیے زیادہ آسان نہیں ہے: وہ ظاہر ہے کہ IDE انسٹال کرنا اور کنسول کی نگرانی نہیں کرنا چاہیں گے :) معلومات کو ریکارڈ کرنے کے لیے ایک زیادہ مانوس فارمیٹ بھی ہے - ٹیکسٹ فائل میں۔ لوگوں کے لیے انہیں اس طرح پڑھنا بہت آسان ہے، اور یقیناً ذخیرہ کرنا بہت آسان ہے! اب دوسرا سوال: پروگرام کے آپریشن کے بارے میں کیا ڈیٹا لاگ میں ریکارڈ کیا جانا چاہئے؟ لیکن یہاں سب کچھ آپ پر منحصر ہے! جاوا لاگنگ سسٹم بہت لچکدار ہے۔ آپ اسے اس طرح ترتیب دے سکتے ہیں کہ آپ کے پروگرام کی پوری پیشرفت لاگ ان ہو جائے گی۔ ایک طرف، یہ اچھا ہے. لیکن دوسری طرف، تصور کریں کہ اگر وہاں سب کچھ لکھا ہوا ہے تو فیس بک یا ٹویٹر لاگ کس سائز تک پہنچ سکتے ہیں۔ اتنی بڑی کمپنیاں شاید اتنی مقدار میں بھی معلومات کو ذخیرہ کرنے کی صلاحیت رکھتی ہیں۔ لیکن تصور کریں کہ 500 گیگا بائٹ ٹیکسٹ کے لاگ میں ایک اہم غلطی کے بارے میں معلومات تلاش کرنا کتنا مشکل ہو گا؟ یہ گھاس کے ڈھیر میں سوئی سے بھی بدتر ہے۔ لہذا، جاوا میں لاگنگ کو ترتیب دیا جا سکتا ہے تاکہ لاگ (لاگ) میں صرف غلطی کا ڈیٹا لکھا جائے۔ یا یہاں تک کہ صرف اہم غلطیوں کے بارے میں! اگرچہ، "لاگ ان جاوا" کہنا مکمل طور پر درست نہیں ہے۔ حقیقت یہ ہے کہ پروگرامرز کے درمیان لاگنگ کی ضرورت اس فعالیت کو زبان میں شامل کرنے سے پہلے پیدا ہوئی تھی۔ اور جب جاوا کی اپنی لاگنگ لائبریری تھی، ہر کوئی پہلے سے ہی log4j لائبریری استعمال کر رہا تھا۔ جاوا میں لاگ ان ہونے کی تاریخ درحقیقت بہت طویل اور معلوماتی ہے؛ اپنی فرصت میں، آپ اس پوسٹ کو Habré پر پڑھ سکتے ہیں ۔ مختصراً، جاوا کی اپنی لاگنگ لائبریری ہے، لیکن تقریباً کوئی بھی اسے استعمال نہیں کرتا :) بعد میں، جب کئی مختلف لاگنگ لائبریریاں نمودار ہوئیں، اور تمام پروگرامرز نے مختلف کو استعمال کرنا شروع کیا، تو مطابقت کا مسئلہ پیدا ہوا۔ لوگوں کو مختلف انٹرفیس کے ساتھ درجن بھر مختلف لائبریریوں کا استعمال کرتے ہوئے ایک ہی کام کرنے سے روکنے کے لیے، slf4j تجریدی فریم ورک بنایا گیا تھا۔("جاوا کے لئے سروس لاگنگ اگواڑا")۔ اسے تجریدی کہا جاتا ہے کیونکہ اگرچہ آپ slf4j کلاسز استعمال کرتے ہیں اور ان کے طریقوں کو کال کرتے ہیں، ان کے نیچے لاگنگ کے تمام پچھلے فریم ورک چل رہے ہیں: log4j، معیاری java.util.logging اور دیگر۔ اگر آپ کو فی الحال log4j کی کسی خاص خصوصیت کی ضرورت ہے جو دوسری لائبریریوں کے پاس نہیں ہے، لیکن آپ اس خاص لائبریری سے پروجیکٹ کو سختی سے لنک نہیں کرنا چاہیں گے، تو صرف slf4j استعمال کریں۔ اور وہ پہلے ہی log4j طریقوں کو "کھینچ" لے گی۔ اگر آپ اپنا ارادہ بدلتے ہیں اور فیصلہ کرتے ہیں کہ آپ کو log4j خصوصیات کی مزید ضرورت نہیں ہے، تو آپ کو دوسری لائبریری استعمال کرنے کے لیے صرف "ریپر" (یعنی slf4j) کو دوبارہ ترتیب دینے کی ضرورت ہے۔ آپ کا کوڈ کام کرنا بند نہیں کرے گا، کیونکہ اس میں آپ slf4j کے طریقوں کو کہتے ہیں، نہ کہ کسی مخصوص لائبریری کے۔ ایک چھوٹا سا اختلاف۔ درج ذیل مثالوں کے کام کرنے کے لیے، آپ کو یہاں سے slf4j لائبریری ، اور log4j لائبریری کو یہاں سے ڈاؤن لوڈ کرنے کی ضرورت ہے ۔ اگلا، ہمیں آرکائیو کو کھولنا ہوگا اور جار فائلوں کو شامل کرنا ہوگا جن کی ہمیں انٹیلیج آئی ڈی ای اے کے ذریعے کلاس پاتھ میں ضرورت ہے۔ مینو آئٹمز: فائل -> پروجیکٹ کا ڈھانچہ -> لائبریریاں ضروری جار کو منتخب کریں اور انہیں پروجیکٹ میں شامل کریں (آرکائیوز میں بہت سے جار ہیں جنہیں ہم نے ڈاؤن لوڈ کیا ہے، تصویروں میں آپ کی ضرورت کو دیکھیں) ![آپ کو لاگنگ کی ضرورت کیوں ہے - 2](https://cdn.javarush.com/images/article/09c92a9d-03af-405e-88f9-9ff66145ba8e/1024.jpeg)
![آپ کو لاگنگ کی ضرورت کیوں ہے - 3](https://cdn.javarush.com/images/article/c87a7e99-c90c-45c5-98a9-109db7daaced/1024.jpeg)
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
</dependency>
بہت اچھا، ہم نے ترتیبات کو ترتیب دیا ہے :) آئیے دیکھتے ہیں کہ slf4j کیسے کام کرتا ہے۔ ہم یہ کیسے یقینی بنا سکتے ہیں کہ پروگرام کی پیشرفت کہیں ریکارڈ کی گئی ہے؟ اس کے لیے ہمیں دو چیزوں کی ضرورت ہے - ایک لاگر اور ایک اپینڈر ۔ آئیے پہلے سے شروع کرتے ہیں۔ لاگر ایک ایسی چیز ہے جو مکمل طور پر ریکارڈ رکھنے کا انتظام کرتی ہے ۔ لاگر بنانا بہت آسان ہے: یہ ایک جامد طریقہ استعمال کرتے ہوئے کیا جاتا ہے 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 record!!!");
LOGGER.error("В программе возникла ошибка!");
}
}
کنسول آؤٹ پٹ: ERROR StatusLogger کوئی Log4j 2 کنفیگریشن فائل نہیں ملی۔ ڈیفالٹ کنفیگریشن کا استعمال کرنا (صرف کنسول میں غلطیوں کو لاگ کرنا)، یا صارف کو پروگرام کے مطابق فراہم کردہ کنفیگریشنز۔ Log4j 2 اندرونی ابتدائی لاگنگ دکھانے کے لیے سسٹم پراپرٹی 'log4j2.debug' سیٹ کریں۔ Log4j 2 15:49:08.907 [main] ERROR MyTestClass - پروگرام میں ایک ایرر آ گیا ہے! ہم یہاں کیا دیکھتے ہیں؟ سب سے پہلے ہم ایک ایرر میسج دیکھتے ہیں۔ یہ ظاہر ہوا کیونکہ ہمارے پاس فی الحال ضروری ترتیبات کی کمی ہے۔ لہذا، ہمارا لاگر اب صرف غلطی کے پیغامات (ERROR) اور صرف کنسول کو آؤٹ پٹ کر سکتا ہے۔ طریقہ کار logger.info()
پر عمل نہیں کیا گیا۔ لیکن logger.error()
اس نے کام کیا! کنسول موجودہ تاریخ، وہ طریقہ دکھاتا ہے جہاں غلطی ہوئی ( main
)، لفظ ERROR اور ہمارا پیغام! ERROR لاگنگ کی سطح ہے۔ عام طور پر، اگر لاگ انٹری کو لفظ ERROR کے ساتھ نشان زد کیا جاتا ہے، تو اس کا مطلب ہے کہ پروگرام میں اس مقام پر ایک خرابی واقع ہوئی ہے۔ اگر کسی اندراج کو لفظ INFO کے ساتھ نشان زد کیا گیا ہے، تو اس کا مطلب ہے کہ یہ پروگرام کے عام آپریشن کے بارے میں صرف موجودہ معلومات ہے۔ SLF4J لائبریری میں لاگنگ کی کچھ مختلف سطحیں ہیں جو آپ کو لاگنگ کو لچکدار طریقے سے ترتیب دینے کی اجازت دیتی ہیں۔ ان کا انتظام کرنا بہت آسان ہے: کلاس میں تمام ضروری منطق پہلے سے ہی شامل ہے Logger
۔ آپ کو صرف ضروری طریقوں کو کال کرنے کی ضرورت ہے۔ اگر آپ باقاعدہ پیغام پوسٹ کرنا چاہتے ہیں، تو کال کریں logger.info()
۔ غلطی کا پیغام - logger.error()
. ایک انتباہ دکھائیں - logger.warn()
اب ہم ضمیمہ کے بارے میں بات کرتے ہیں ۔ اپینڈر وہ جگہ ہے جہاں آپ کا ڈیٹا آتا ہے۔ آپ کہہ سکتے ہیں کہ ڈیٹا سورس کا مخالف "پوائنٹ B" ہے۔ پہلے سے طے شدہ طور پر، ڈیٹا کنسول میں آؤٹ پٹ ہوتا ہے۔ براہ کرم نوٹ کریں کہ پچھلی مثال میں ہمیں کچھ بھی ترتیب دینے کی ضرورت نہیں تھی: متن خود کنسول میں ظاہر ہوا، لیکن log4j لائبریری سے لاگر کنسول میں صرف ERROR سطح کے پیغامات ہی آؤٹ پٹ کر سکتا ہے۔ ظاہر ہے کہ لوگوں کے لیے ٹیکسٹ فائل سے لاگز پڑھنا اور انہی فائلوں میں لاگ اسٹور کرنا زیادہ آسان ہے۔ لاگر کے ڈیفالٹ رویے کو تبدیل کرنے کے لیے، ہمیں اپنی فائل اپینڈر کو کنفیگر کرنے کی ضرورت ہے ۔ شروع کرنے کے لیے، آپ کو log4j.xml فائل سیدھے src فولڈر میں ، یا وسائل کے فولڈر میں، اگر آپ Maven استعمال کرتے ہیں، یا وسائل کے فولڈر میں، اگر آپ Maven استعمال کرتے ہیں۔ آپ 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">
یہ نام نہاد اسٹیٹس لاگر ہے۔ یہ ہمارے لاگر سے متعلق نہیں ہے اور log4j کے ذریعہ اندرونی طور پر استعمال کیا جاتا ہے۔ آپ status="INFO" کے بجائے status="TRACE" سیٹ کر سکتے ہیں، اور log4j کے اندرونی کاموں کے بارے میں تمام معلومات کنسول میں آؤٹ پٹ ہوں گی (اسٹیٹس لاگر ڈیٹا کو کنسول میں آؤٹ پٹ کرتا ہے، چاہے پروگرام کے لیے ہمارا اپینڈر فائل ہی کیوں نہ ہو۔ پر مبنی)۔ ہمیں اب اس کی ضرورت نہیں ہے، لہذا ہم سب کچھ ویسا ہی چھوڑ دیں گے۔
<Appenders>
<File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
یہاں ہم اپنا اپینڈر بناتے ہیں۔ ٹیگ <File>
اشارہ کرتا ہے کہ یہ ایک فائل ہوگی۔ 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=”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("Начало работы программы!!!");
try {
LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
System.out.println(12/0);
} catch (ArithmeticException x) {
LOGGER.error("Ошибка! Произошло деление на ноль!");
}
}
}
یقیناً، یہ تھوڑا ٹیڑھا ہے (RuntimeException کو پکڑنا ایک معمولی خیال ہے)، لیکن یہ ہمارے مقاصد کے لیے بہترین ہے :) آئیے اپنا طریقہ main()
لگاتار 4 بار چلائیں اور اپنی testlog.txt فائل دیکھیں۔ اسے پہلے سے بنانے کی ضرورت نہیں ہے: لائبریری خود بخود کرے گی۔ سب کچھ کام کیا! :) اب آپ کے پاس کنفیگرڈ لاگر ہے۔ آپ کچھ پروگراموں کے ساتھ کھیل سکتے ہیں جو آپ نے پہلے لکھے تھے، تمام طریقوں میں لاگر کالز شامل کرتے ہوئے، اور نتیجے میں لاگ کو دیکھیں :) اضافی پڑھنے کے لیے، میں اس مضمون کی انتہائی سفارش کرتا ہوں ۔ وہاں، لاگنگ کے موضوع پر گہرائی سے بحث کی گئی ہے، اور اسے ایک نشست میں پڑھنا آسان نہیں ہوگا۔ لیکن اس میں بہت ساری مفید اضافی معلومات ہیں۔ مثال کے طور پر، آپ سیکھیں گے کہ لاگر کو کنفیگر کرنا ہے تاکہ یہ ایک نئی ٹیکسٹ فائل بنائے اگر ہماری testlog.txt فائل ایک خاص سائز تک پہنچ جائے :) اور یہ ہمارے سبق کا اختتام ہے! آج آپ نے ایک بہت ہی اہم موضوع کے بارے میں جان لیا، اور یہ علم یقیناً آپ کے مستقبل کے کام میں مفید ثابت ہوگا۔ پھر ملیں گے! :)
GO TO FULL VERSION