"صبح جو سلام، اڄ هڪ واقعو صنعتي سائيٽ تي رڪارڊ ڪيو ويو، مان ڊولپر کان پڇان ٿو ته تجزيو گروپ ۾ شامل ٿيڻ لاء." توهان جي ڪم تي هڪ ڏينهن هن طرح ڪجهه شروع ڪري سگهي ٿو، يا اهو صبح ٿي سگهي ٿو - اهو مسئلو ناهي. پر اچو ته شروعات کان شروع ڪريون. جاوا رش ۾ هتي مسئلا حل ڪرڻ سان، توهان ڪوڊ لکڻ سکندا آهيو جيڪو ڪم ڪندو آهي ۽ ڪندو آهي جيڪو ان جي توقع رکي ٿو. جيڪڏهن توهان مدد واري حصي کي ڏسو ، اهو واضح آهي ته اهو هميشه پهريون ڀيرو ڪم نٿو ڪري. ڪم تي به ائين ئي ٿيندو. توهان هميشه پهريون ڀيرو مسئلو حل نه ڪندا: ڪيڙا اسان جا ابدي ساٿي آهن. اهو ضروري آهي ته توهان بگ جي واقعن کي بحال ڪري سگهو ٿا. اچو ته هڪ مثال سان شروع ڪريون. اچو ته تصور ڪريو ته توهان پوليس وارا آهيو. توهان کي واقعي واري جاء تي سڏيو ويو (شيشي هڪ دڪان ۾ ڀڄي ويو)، توهان پهتو، ۽ اهي توهان جي جوابن جي انتظار ۾ آهن ته ڇا ٿيو. ڪٿي شروع ڪرڻ لاء؟ مون کي خبر ناهي ته پوليس ڪيئن ڪم ڪري ٿي. بلڪل مشروط - اھي شاھد، ثبوت ۽ اھو سڀ شيون ڳولڻ شروع ڪن ٿا. ڇا ٿيندو جيڪڏھن جڳھ پاڻ توھان کي تفصيل سان ٻڌائي سگھي ته ڇا ٿيو؟ مثال طور، هن طرح:
- 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 - ٻيو ڪجهه.
- DEBUG - هڪ خاص لمحن جي واقعن کي وڌيڪ تفصيل سان بيان ڪري ٿو. مثال طور، تاريخ ۾ جنگ جو تفصيل ڊيبگ جي سطح تي آهي. ” ڪمانڊر تاڪيوٽوچ پنهنجي فوج سان سلووچا جي ڳوٺ ڏانهن وڌيو .
- ERROR - غلطيون جيڪي ٿينديون آهن عام طور تي هتي لکيون وينديون آهن. توهان شايد محسوس ڪيو آهي ته جڏهن توهان ڪنهن شيء کي لپيندا آهيو
try-catch
، بلاڪ کيcatch
متبادل بڻايو ويندو آهيe.printStacktrace()
. اهو صرف ڪنسول ۾ داخلا داخل ڪري ٿو. هڪ لاگر استعمال ڪندي، توهان هن داخلا کي لاگر ڏانهن موڪلي سگهو ٿا (هاها)، توهان کي خيال اچي ٿو. - خبردار - ڊيڄاريندڙ هتي لکيل آهن. مثال طور، هڪ ڪار ۾ هڪ overheating روشني. اهو صرف هڪ ڊيڄاريندڙ آهي، ۽ اهو بهتر آهي ته ڪجهه تبديل ڪرڻ، پر اهو هڪ ڀڃڪڙي ناهي. جڏهن مشين خراب ٿي ويندي، پوء اسان 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