JavaRush /Java blogi /Random-UZ /Java jurnali. Stektras to'pini echib oling

Java jurnali. Stektras to'pini echib oling

Guruhda nashr etilgan
"Xayrli kun, bugun sanoat maydonchasida hodisa qayd etildi, men ishlab chiquvchidan tahlil guruhiga qo'shilishni so'rayman." Ishdagi kunlaringizdan biri shunday boshlanishi mumkin yoki ertalab bo'lishi mumkin - bu muhim emas. Lekin boshidan boshlaylik. JavaRush-da muammolarni hal qilish orqali siz ishlaydigan va undan kutilgan narsani bajaradigan kod yozishni o'rganasiz. Agar siz yordam bo'limiga qarasangiz , bu har doim ham birinchi marta ishlamasligi aniq. Ishda ham xuddi shunday bo'ladi. Siz har doim ham muammoni birinchi marta hal qila olmaysiz: xatolar bizning abadiy hamrohimiz. Xato voqealarini tiklashingiz muhim. Jurnal yozish.  Stektras to'pini echib oling - 1Keling, misol bilan boshlaylik. Tasavvur qilaylik, siz politsiyachisiz. Sizni voqea joyiga chaqirishdi (do‘konda oyna sindirilgan), siz yetib keldingiz va ular sizdan nima bo‘lganligi haqida javob kutishmoqda. Qayerdan boshlash kerak? Politsiya qanday ishlashini bilmayman. Juda shartli - ular guvohlarni, dalillarni va shunga o'xshash narsalarni qidira boshlaydilar. Agar joyning o'zi sizga nima bo'lganini batafsil aytib bersa nima bo'ladi? Masalan, bu kabi:
  • 21:59 egasi signalni yoqdi (to'liq faollashguncha 5 daqiqa)
  • 22:00 egasi eshikni yopdi
  • 22:05 signalni to'liq faollashtirish
  • 22:06 egasi tutqichni tortdi
  • 23:15 shovqin sensori yoqilgan
  • 23:15 Bir to'da itlar baland ovozda hurgancha yugurib o'tishdi
  • 23:15 shovqin sensori o'chirilgan
  • 01:17 displeyning tashqi oynasidagi zarba sensori yoqildi
  • 01:17 stakanga kaptar uchib kirdi
  • 01:17 shisha sindi
  • 01:17 sirena yoqilgan
  • 01:17 kaptar o'zini silkitib, uchib ketdi
Xo'sh, bunday tafsilotlarni uzoq vaqt o'rganishingiz shart emas, nima bo'lganligi darhol aniq bo'ladi. Rivojlanishda ham xuddi shunday. Yozuvlardan nima bo'lganini aytish juda zo'r. Endi siz disk raskadrovkani eslayotgan bo'lishingiz mumkin, chunki siz hamma narsani tuzatishingiz mumkin. Lekin yoq. Siz uyga bordingiz va kechasi hamma narsa buzildi, disk raskadrovka uchun hech narsa yo'q: nima uchun u buzilganligini tushunishingiz va uni tuzatishingiz kerak. Bu erda jurnallar o'ynaydi, bir kechada sodir bo'lgan hamma narsaning tarixi. Maqola davomida men sizga eng mashhur loggerlardan biri (aslida logger emas, ko'proq monitoring kabi) nima haqida o'ylab ko'rishingizni maslahat beraman, bu yangiliklarni tinglagan (tomosha qilgan) har bir kishi eshitgan bo'lishi mumkin? Unga rahmat, ba'zi voqealar tiklanadi. Endi jiddiy gapiraylik. Java-ga kirish - bu kodda sodir bo'lgan har qanday hodisalarni yozib olish jarayoni. Sizning kodingiz nima qilganini yozish dasturchi sifatida sizning mas'uliyatingizdir, chunki keyin bu jurnallar tahlil qilish uchun sizga beriladi. Agar hamma narsa yaxshi bajarilgan bo'lsa, unda har qanday xato juda tez tartibga solinadi va tuzatiladi. Bu erda men, ehtimol, qanday loggerlar borligini o'rganmayman. Ushbu maqolada biz oddiy narsalar bilan cheklanamiz java.util.Logger: bu bir-birimiz bilan tanishish uchun etarli. Har bir jurnalda sana-vaqt, voqea darajasi, xabar mavjud. Sana va vaqt avtomatik ravishda kiritiladi. Voqea darajasi xabar muallifi tomonidan tanlanadi. Bir necha darajalar mavjud. Asosiylari - ma'lumot, disk raskadrovka, xato.
  • INFO - odatda bu nima sodir bo'layotgani haqidagi ma'lumot xabarlari, sana bo'yicha tarixga o'xshash narsa: 1915 yil - biror narsa sodir bo'ldi, 1916 yil - boshqa narsa.
  • DEBUG - ma'lum bir lahzadagi voqealarni batafsilroq tasvirlaydi. Masalan, tarixdagi jang tafsilotlari tuzatish darajasida." Qo'mondon Takoytovich o'z qo'shinlari bilan Selovicha qishlog'i tomon yurdi ."
  • ERROR - yuzaga kelgan xatolar odatda bu erda yoziladi. Ehtimol, siz biror narsani o'ralganingizda try-catch, blok catchbilan almashtirilganini payqagandirsiz e.printStacktrace(). U faqat konsolga kirishni chiqaradi. Loggerdan foydalanib, siz ushbu yozuvni loggerga yuborishingiz mumkin (haha), siz g'oyani olasiz.
  • OGOHLANTIRISH - bu erda ogohlantirishlar yozilgan. Masalan, mashinada haddan tashqari qizib ketgan chiroq. Bu shunchaki ogohlantirish va biror narsani o'zgartirish yaxshiroq, lekin bu buzilish emas. Mashina ishlamay qolganda, biz ERROR darajasi bilan tizimga kiramiz.
Biz darajalarni ajratdik. Lekin tashvishlanmang: ularning orasidagi chiziq juda nozik - buni hamma ham tushuntira olmaydi. Bundan tashqari, u loyihadan loyihaga farq qilishi mumkin. Katta ishlab chiquvchi sizga qaysi darajada va qanday tizimga kirish kerakligini tushuntiradi. Asosiysi, bu yozuvlar kelajakda tahlil qilish uchun etarli. Va bu tezda tushuniladi. Keyingi sozlamalar. Loggerlarga qayerga yozishni aytish mumkin (konsolga, faylga, jms yoki boshqa joyga) va darajani ko'rsatish (ma'lumot, xato, disk raskadrovka ...). Bizning oddiy loggerimiz uchun sozlamalar misoli quyidagicha ko'rinadi:
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
Bunday holda, hamma narsa logger bir vaqtning o'zida faylga va konsolga yozishi uchun tuzilgan. Shunday bo'lgan taqdirda? agar konsolda biror narsa o'chirilgan bo'lsa, fayl bo'yicha qidirish osonroq bo'ladi. Ikkalasi uchun INFO darajasi. Fayl uchun nom namunasi ham ko'rsatilgan. Bu bir vaqtning o'zida konsolga ham, faylga ham yozish imkonini beruvchi minimal konfiguratsiya. fayldagi eski yozuvlar o'chirilmasligi uchun rost qiymatinijava.util.logging.FileHandler.append o'rnating . Foydalanish misoli bu (sharhlarsiz, logger o'z-o'zidan sharhlaydi):
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);
        }
    }
}
Bu eng yaxshi misol emas, men qo'limda bo'lganini oldim. Chiqish misoli:
апр 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)
Bu erda men eslatmalarga e'tibor qaratmoqchiman:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Ushbu yozuv juda foydasiz va ma'lumotga ega emas. Xato yozuvi kabi:
WARNING: что-то пошло не так
Siz buni yozmasligingiz kerak: bu jurnal uchun jurnal, u faqat yo'lda qoladi. Har doim mazmunli narsalarni yozishga harakat qiling. Menimcha, bu foydalanishni to'xtatish System.out.printlnva kattalar o'yinchoqlariga o'tish uchun etarli. Kamchiliklari bor java.util.logging. Misol uchun, men yuqorida tavsiflangan darajalar bu erda emas, lekin ular eng ko'p ishlatiladigan loggerlarda. Men ushbu maqola uchun uni tanladim java.util.logging, chunki u ulanish bilan qo'shimcha manipulyatsiyalarni talab qilmaydi. LOGGER.infoShuni ham ta'kidlab o'tamanki, uning o'rniga foydalanish mumkin LOGGER.log(Level.INFO... Kamchiliklardan biri bu erda allaqachon paydo bo'lgan: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- bu sizga xabar va ob'ektni uzatish imkonini beradi Exception, loggerning o'zi uni chiroyli tarzda yozib qo'yadi. Shu bilan birga, LOGGER.warning("");u faqat xabar oladi, ya'ni. Istisnoni o'tkazib bo'lmaydi, uni o'zingiz satrga tarjima qilishingiz kerak. Java logging bilan tanishish uchun bu misol yetarli deb umid qilaman. Keyin boshqa loggerlarni (log4j, slf4j, Logback...) ulashingiz mumkin - ularning ko'pi bor, lekin mohiyati bir xil ^ harakatlar tarixini yozib olish. Rasmiy darslik
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION