"صبح بخیر، آج صنعتی سائٹ پر ایک واقعہ ریکارڈ کیا گیا، میں ڈویلپر سے تجزیہ گروپ میں شامل ہونے کو کہتا ہوں۔" کام پر آپ کا ایک دن کچھ اس طرح شروع ہو سکتا ہے، یا یہ صبح ہو سکتی ہے – اس سے کوئی فرق نہیں پڑتا۔ لیکن آئیے شروع سے شروع کرتے ہیں۔ یہاں جاوا رش میں مسائل کو حل کرکے، آپ کوڈ لکھنا سیکھتے ہیں جو کام کرتا ہے اور کرتا ہے جو اس سے توقع کی جاتی ہے۔ اگر آپ مدد کے حصے کو دیکھیں تو یہ واضح ہے کہ یہ ہمیشہ پہلی بار کام نہیں کرتا۔ کام پر بھی ایسا ہی ہوگا۔ آپ ہمیشہ پہلی بار کسی مسئلے کو حل نہیں کریں گے: کیڑے ہمارے ابدی ساتھی ہیں۔ یہ ضروری ہے کہ آپ بگ کے واقعات کو بحال کر سکیں۔ آئیے ایک مثال سے شروع کرتے ہیں۔ آئیے تصور کریں کہ آپ پولیس والے ہیں۔ آپ کو جائے وقوعہ پر بلایا گیا تھا (ایک اسٹور میں شیشہ ٹوٹا ہوا تھا)، آپ پہنچ گئے، اور وہ آپ کے جوابات کے منتظر ہیں کہ کیا ہوا ہے۔ کہاں سے شروع کریں؟ مجھے نہیں معلوم کہ پولیس کیسے کام کرتی ہے۔ بہت مشروط طور پر - وہ گواہوں، ثبوتوں اور اس سب چیزوں کی تلاش شروع کر دیتے ہیں۔ کیا ہوا اگر جگہ خود آپ کو تفصیل سے بتا سکے کہ کیا ہوا؟ مثال کے طور پر، اس طرح:
- 21:59 مالک نے الارم آن کر دیا (مکمل طور پر چالو ہونے تک 5 منٹ)
- 22:00 مالک نے دروازہ بند کر دیا۔
- 22:05 مکمل الارم ایکٹیویشن
- 22:06 مالک نے ہینڈل کھینچا۔
- 23:15 شور سینسر آن ہے۔
- 23:15 کتوں کا ایک ٹولہ زور سے بھونکتے ہوئے پیچھے سے بھاگا۔
- 23:15 شور سینسر بند ہے۔
- 01:17 ڈسپلے کیس کے بیرونی شیشے پر شاک سینسر آن ہو گیا۔
- 01:17 ایک کبوتر شیشے میں اڑ گیا۔
- 01:17 شیشہ ٹوٹ گیا۔
- 01:17 سائرن آن
- 01:17 کبوتر خود کو ہلا کر اڑ گیا۔
java.util.Logger
: ایک دوسرے کو جاننے کے لیے یہ کافی سے زیادہ ہے۔ ہر لاگ انٹری میں تاریخ کا وقت، واقعہ کی سطح، پیغام ہوتا ہے۔ تاریخ اور وقت خود بخود درج ہو جاتے ہیں۔ ایونٹ کی سطح کا انتخاب پیغام کے مصنف نے کیا ہے۔ کئی درجے ہیں۔ اہم ہیں معلومات، ڈیبگ، غلطی۔
- INFO - عام طور پر یہ کیا ہو رہا ہے کے بارے میں معلوماتی پیغامات ہوتے ہیں، تاریخ کے لحاظ سے تاریخ کی طرح کچھ: 1915 - کچھ ہوا، 1916 - کچھ اور۔
- ڈیبگ - کسی خاص لمحے کے واقعات کو مزید تفصیل سے بیان کرتا ہے۔ مثال کے طور پر، تاریخ میں کسی جنگ کی تفصیلات ڈیبگ کی سطح پر ہیں۔" کمانڈر تاکیتووچ اپنی فوج کے ساتھ سیلووچا گاؤں کی طرف بڑھے ۔"
- ERROR - جو غلطیاں ہوتی ہیں وہ عام طور پر یہاں لکھی جاتی ہیں۔ آپ نے شاید محسوس کیا ہو گا کہ جب آپ کسی چیز کو لپیٹتے ہیں
try-catch
تو بلاکcatch
کی جگہe.printStacktrace()
. یہ صرف کنسول میں اندراج کو آؤٹ پٹ کرتا ہے۔ ایک لاگر کا استعمال کرتے ہوئے، آپ اس اندراج کو لاگر کو بھیج سکتے ہیں (ہاہا)، آپ کو خیال آتا ہے۔ - خبردار - انتباہات یہاں لکھے گئے ہیں۔ مثال کے طور پر، گاڑی میں زیادہ گرم روشنی۔ یہ صرف ایک انتباہ ہے، اور کسی چیز کو تبدیل کرنا بہتر ہے، لیکن یہ خرابی نہیں ہے۔ جب مشین ٹوٹ جائے گی، تب ہم ERROR سطح کے ساتھ لاگ ان کریں گے۔
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.%u.%g.txt
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
اس صورت میں، سب کچھ ترتیب دیا گیا ہے تاکہ لاگر ایک ہی وقت میں فائل اور کنسول پر لکھے۔ اس صورت میں؟ اگر کنسول میں کوئی چیز مٹ جاتی ہے، تو فائل کے ذریعے تلاش کرنا آسان ہے۔ دونوں کے لیے معلومات کی سطح۔ فائل کے لیے نام کا نمونہ بھی بیان کیا گیا ہے۔ یہ ایک کم سے کم ترتیب ہے جو آپ کو کنسول اور فائل دونوں پر ایک ساتھ لکھنے کی اجازت دیتی ہے۔ درستjava.util.logging.FileHandler.append
پر سیٹ کریں تاکہ فائل میں پرانی اندراجات مٹ نہ جائیں۔ استعمال کی ایک مثال یہ ہے (بغیر تبصرے کے، لاگر خود پر تبصرہ کرتا ہے):
public class Main {
static Logger LOGGER;
static {
try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(Main.class.getName());
}catch (Exception ignore){
ignore.printStackTrace();
}
}
public static void main(String[] args) {
try {
LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
List<Integer> ints = new ArrayList<Integer>();
LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
List empty = ints;
LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
List<String> string = empty;
LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла бла");
LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла 23");
LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла 34");
LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
for (Object anInt : ints) {
System.out.println(anInt);
}
LOGGER.log(Level.INFO,"Размер equals " + ints.size());
LOGGER.log(Level.INFO,"Получим первый элемент");
Integer integer = ints.get(0);
LOGGER.log(Level.INFO,"выведем его в консоль");
System.out.println(integer);
}catch (Exception e){
LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
}
}
}
یہ بہترین مثال نہیں ہے، میں نے وہی لیا جو ہاتھ میں تھا۔ مثال آؤٹ پٹ:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at generics.Main.main(Main.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
یہاں میں نوٹوں پر توجہ مرکوز کرنا چاہتا ہوں:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
یہ اندراج بالکل بیکار ہے اور معلوماتی نہیں ہے۔ غلطی کے اندراج کی طرح:
WARNING: что-то пошло не так
آپ کو یہ نہیں لکھنا چاہئے: یہ لاگ کی خاطر لاگ ہے، یہ صرف راستے میں آئے گا۔ ہمیشہ بامعنی باتیں لکھنے کی کوشش کریں۔ System.out.println
میرے خیال میں اس کا استعمال بند کرنے اور بالغوں کے کھلونوں کی طرف جانے کے لیے یہ کافی ہے ۔ اس java.util.logging
کے نقصانات ہیں۔ مثال کے طور پر، میں نے اوپر بیان کردہ سطحیں یہاں نہیں ہیں، لیکن وہ سب سے زیادہ استعمال شدہ لاگرز میں ہیں۔ میں نے اس مضمون کے لیے اس کا انتخاب کیا ہے java.util.logging
کیونکہ اسے کنکشن کے ساتھ اضافی ہیرا پھیری کی ضرورت نہیں ہے۔ میں یہ بھی نوٹ کروں گا کہ اس کی LOGGER.info
بجائے استعمال کیا جا سکتا ہے LOGGER.log(Level.INFO...
یہاں پہلے سے موجود نقصانات میں سے ایک: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
- یہ آپ کو پیغام اور کسی چیز کو منتقل کرنے کی اجازت دیتا ہے Exception
، لاگر خود اسے خوبصورتی سے لکھے گا۔ ایک ہی وقت میں، LOGGER.warning("");
یہ صرف ایک پیغام وصول کرتا ہے، یعنی استثنیٰ کو پاس نہیں کیا جا سکتا، آپ کو اسے خود ہی اسٹرنگ میں ترجمہ کرنا ہوگا۔ مجھے امید ہے کہ یہ مثال جاوا لاگنگ سے واقفیت کے لیے کافی ہے۔ پھر آپ دوسرے لاگرز (log4j, slf4j, Logback...) کو جوڑ سکتے ہیں - ان میں سے بہت سے ہیں، لیکن اعمال کی تاریخ کو ریکارڈ کرنے کے لیے جوہر ایک ہی ہے۔ سرکاری ٹیوٹوریل
GO TO FULL VERSION