JavaRush /جاوا بلاگ /Random-SD /جاوا لاگنگ. اسٽيڪٽريس جو هڪ بال کوليو

جاوا لاگنگ. اسٽيڪٽريس جو هڪ بال کوليو

گروپ ۾ شايع ٿيل
"صبح جو سلام، اڄ هڪ واقعو صنعتي سائيٽ تي رڪارڊ ڪيو ويو، مان ڊولپر کان پڇان ٿو ته تجزيو گروپ ۾ شامل ٿيڻ لاء." توهان جي ڪم تي هڪ ڏينهن هن طرح ڪجهه شروع ڪري سگهي ٿو، يا اهو صبح ٿي سگهي ٿو - اهو مسئلو ناهي. پر اچو ته شروعات کان شروع ڪريون. جاوا رش ۾ هتي مسئلا حل ڪرڻ سان، توهان ڪوڊ لکڻ سکندا آهيو جيڪو ڪم ڪندو آهي ۽ ڪندو آهي جيڪو ان جي توقع رکي ٿو. جيڪڏهن توهان مدد واري حصي کي ڏسو ، اهو واضح آهي ته اهو هميشه پهريون ڀيرو ڪم نٿو ڪري. ڪم تي به ائين ئي ٿيندو. توهان هميشه پهريون ڀيرو مسئلو حل نه ڪندا: ڪيڙا اسان جا ابدي ساٿي آهن. اهو ضروري آهي ته توهان بگ جي واقعن کي بحال ڪري سگهو ٿا. لاگنگ.  اسٽيڪٽريس جو هڪ بال کوليو - 1اچو ته هڪ مثال سان شروع ڪريون. اچو ته تصور ڪريو ته توهان پوليس وارا آهيو. توهان کي واقعي واري جاء تي سڏيو ويو (شيشي هڪ دڪان ۾ ڀڄي ويو)، توهان پهتو، ۽ اهي توهان جي جوابن جي انتظار ۾ آهن ته ڇا ٿيو. ڪٿي شروع ڪرڻ لاء؟ مون کي خبر ناهي ته پوليس ڪيئن ڪم ڪري ٿي. بلڪل مشروط - اھي شاھد، ثبوت ۽ اھو سڀ شيون ڳولڻ شروع ڪن ٿا. ڇا ٿيندو جيڪڏھن جڳھ پاڻ توھان کي تفصيل سان ٻڌائي سگھي ته ڇا ٿيو؟ مثال طور، هن طرح:
  • 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...) - انھن مان گھڻا آھن، پر عملن جي تاريخ کي رڪارڊ ڪرڻ لاءِ مضمون ساڳيو آھي. سرڪاري سبق
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION