JavaRush /Java blogi /Random-UZ /Nega jurnalga kirish kerak?

Nega jurnalga kirish kerak?

Guruhda nashr etilgan
Salom! Ma'ruzalarni yozishda, ayniqsa, ma'lum bir mavzu haqiqiy ishda qo'llanilishiga e'tibor beraman. Nima uchun ro'yxatga olish kerak - 1 Demak, DIQQAT! Bugun biz to'xtaladigan mavzu ishning birinchi kunidan boshlab barcha loyihalaringizda sizga albatta foydali bo'ladi. Biz kirish haqida gaplashamiz. Bu mavzu umuman qiyin emas (hatto oson deyman). Ammo birinchi ishingizda hali ham aniq narsalar bilan shug'ullanish uchun etarlicha stress bo'ladi, shuning uchun uni hozir yaxshilab saralash yaxshiroqdir :) Shunday qilib, boshlaylik. Ro'yxatga olish nima? Ro'yxatga olish - bu biron bir joyda dasturning ishlashi haqida ma'lumotlarni yozib olish. Ushbu ma'lumotlar yoziladigan joy " jurnal " deb ataladi. Bir vaqtning o'zida ikkita savol tug'iladi: qaerda va qanday ma'lumotlar qayd etilgan? Keling, "qaerda" dan boshlaylik. Dasturning ishlashi haqidagi ma'lumotlarni turli joylarda yozib olishingiz mumkin. Misol uchun, o'qish paytida siz tez-tez ma'lumotlarni konsolga chiqarasiz System.out.println(). Bu eng oddiy bo'lsa ham, haqiqiy jurnal. Albatta, bu mijoz yoki mahsulotni qo'llab-quvvatlash jamoasi uchun juda qulay emas: ular IDE-ni o'rnatishni va konsolni kuzatishni xohlamaydilar :) Bundan tashqari, ma'lumotni yozib olish uchun ko'proq tanish format mavjud - matnli faylda. Odamlarga ularni shu tarzda o'qish ancha oson va, albatta, saqlash ancha oson! Endi ikkinchi savol: dasturning ishlashi haqida qanday ma'lumotlar jurnalga yozilishi kerak? Ammo bu erda hamma narsa sizga bog'liq! Java jurnali tizimi juda moslashuvchan. Siz uni dasturingizning butun jarayoni qayd qilinadigan tarzda sozlashingiz mumkin. Bir tomondan, bu yaxshi. Ammo boshqa tomondan, agar u erda hamma narsa yozilgan bo'lsa, Facebook yoki Twitter jurnallari qanday hajmga etishi mumkinligini tasavvur qiling. Bunday yirik kompaniyalar, ehtimol, hatto bu hajmdagi ma'lumotlarni saqlash qobiliyatiga ega. Tasavvur qiling-a, 500 gigabaytlik matn jurnallarida bitta muhim xato haqida ma'lumot izlash qanchalik qiyin bo'ladi? Bu pichandagi ignadan ham battar. Shuning uchun, Java-ga kirishni shunday sozlash mumkinki, jurnalga (jurnalga) faqat xato ma'lumotlari yoziladi. Yoki faqat tanqidiy xatolar haqida! Garchi, "Java-ga kirish" deyish mutlaqo to'g'ri emas. Gap shundaki, ushbu funktsiya tilga qo'shilishidan oldin dasturchilar orasida jurnalga kirish zarurati paydo bo'lgan. Va Java o'zining jurnal kutubxonasiga ega bo'lgan vaqtga kelib, hamma allaqachon log4j kutubxonasidan foydalanayotgan edi. Java-da loggingning paydo bo'lishi tarixi aslida juda uzoq va ma'lumotlidir; bo'sh vaqtingizda Habré-da ushbu postni o'qishingiz mumkin . Xulosa qilib aytganda, Java-ning o'z logging kutubxonasi bor, lekin undan deyarli hech kim foydalanmaydi :) Keyinchalik, bir nechta turli jurnallar kutubxonalari paydo bo'lib, barcha dasturchilar turli xillaridan foydalana boshlaganlarida, moslik muammosi paydo bo'ldi. Turli xil interfeyslarga ega o'nlab turli kutubxonalar yordamida odamlar bir xil ishni qilishlariga yo'l qo'ymaslik uchun slf4j abstraksiya ramkasi yaratildi.(“Java uchun xizmat jurnali fasad”). Bu abstraktlash deb ataladi, chunki siz slf4j sinflaridan foydalansangiz va ularning usullarini chaqirsangiz ham, ular ostida barcha oldingi logging ramkalari ishlaydi: log4j, standart java.util.logging va boshqalar. Agar sizga log4j ning boshqa kutubxonalarda mavjud bo'lmagan o'ziga xos xususiyati kerak bo'lsa, lekin siz loyihani ushbu kutubxonaga qat'iy bog'lashni xohlamasangiz, shunchaki slf4j dan foydalaning. Va u allaqachon log4j usullarini "tortib oladi". Agar fikringizni o‘zgartirsangiz va log4j funksiyalariga endi kerak emas deb qaror qilsangiz, boshqa kutubxonadan foydalanish uchun “o‘ram”ni (ya’ni slf4j) qayta sozlashingiz kifoya. Sizning kodingiz ishlashni to'xtatmaydi, chunki unda siz ma'lum bir kutubxonaning emas, balki slf4j usullarini chaqirasiz. Kichkina chekinish. Quyidagi misollar ishlashi uchun slf4j kutubxonasini bu yerdan , log4j kutubxonasini esa bu yerdan yuklab olishingiz kerak . Keyinchalik, arxivni ochishimiz va kerak bo'lgan jar fayllarini Intellij IDEA orqali sinf yo'liga qo'shishimiz kerak. Menyu bandlari: Fayl -> Loyiha tuzilmasi -> Kutubxonalar Kerakli bankalarni tanlang va ularni loyihaga qo'shing (biz yuklab olgan arxivlarda ko'plab bankalar bor, rasmlarda sizga kerak bo'lgan bankalarga qarang) Nima uchun jurnalga kirish kerak - 2Nima uchun ro'yxatga olish kerak - 3Eslatma - bu ko'rsatma shular uchun Mavendan qanday foydalanishni bilmagan talabalar. Agar siz undan qanday foydalanishni bilsangiz, undan boshlashga urinib ko'rganingiz ma'qul: bu odatda ancha oson.Agar siz Maven dan foydalansangiz , quyidagi bog'liqlikni qo'shing:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Ajoyib, biz sozlamalarni saralab oldik :) Keling, slf4j qanday ishlashini ko'rib chiqaylik. Dasturning borishi biror joyda yozilganligiga qanday ishonch hosil qilishimiz mumkin? Buning uchun bizga ikkita narsa kerak - logger va appender . Birinchisidan boshlaylik. Logger - bu ro'yxatga olishni to'liq boshqaradigan ob'ekt . Loggerni yaratish juda oson: u statik usul yordamida amalga oshiriladi - LoggerFactory.getLogger(). Usulning parametri sifatida siz ishi qayd qilinadigan sinfdan o'tishingiz kerak. Keling, kodimizni ishga tushiramiz:
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("В программе возникла ошибка!");
   }
}
Konsol chiqishi: ERROR StatusLogger Log4j 2 konfiguratsiya fayli topilmadi. Standart konfiguratsiyadan foydalanish (faqat xatolarni konsolga kiritish) yoki foydalanuvchi tomonidan dastur tomonidan taqdim etilgan konfiguratsiyalar. Log4j 2 ichki ishga tushirish jurnalini ko'rsatish uchun "log4j2.debug" tizim xususiyatini o'rnating. Log4j 2 15:49:08.907 ni sozlash bo'yicha ko'rsatmalar uchun https://logging.apache.org/log4j/2.x/manual/configuration.html ga qarang 15:49:08.907 [asosiy] ERROR MyTestClass - Dasturda xatolik yuz berdi! Bu erda nimani ko'ramiz? Avval biz xato xabarini ko'ramiz. Bu bizda hozirda kerakli sozlamalar yo'qligi sababli paydo bo'ldi. Shuning uchun, bizning loggerimiz endi faqat xato xabarlarini (ERROR) va faqat konsolga chiqarishi mumkin. Usul logger.info()bajarilmadi. Lekin logger.error()u ishladi! Konsol joriy sanani, xatolik yuz bergan usulni ( main), ERROR so'zini va bizning xabarimizni ko'rsatadi! ERROR – jurnalga yozish darajasi. Umuman olganda, agar jurnal yozuvi ERROR so'zi bilan belgilangan bo'lsa, bu dasturning o'sha nuqtasida xatolik yuz berganligini anglatadi. Agar yozuv INFO so'zi bilan belgilangan bo'lsa, bu shunchaki dasturning normal ishlashi haqidagi joriy ma'lumotni anglatadi. SLF4J kutubxonasida ro'yxatga olishni moslashuvchan tarzda sozlash imkonini beruvchi juda ko'p turli xil ro'yxatga olish darajalari mavjud. Ularni boshqarish juda oson: barcha kerakli mantiq allaqachon sinfga kiritilgan Logger. Siz faqat kerakli usullarni chaqirishingiz kerak. Agar siz muntazam xabar yubormoqchi bo'lsangiz, telefon raqamiga qo'ng'iroq qiling logger.info(). Xato xabari - logger.error(). Ogohlantirishni ko'rsatish - Endi qo'shimchalogger.warn() haqida gapiraylik . Qo'shimcha ma'lumotlaringiz keladigan joy. Ma'lumotlar manbasining aksi "B nuqtasi" deb ayta olasiz. Odatiy bo'lib, ma'lumotlar konsolga chiqariladi. Iltimos, shuni yodda tutingki, avvalgi misolda biz hech narsani sozlashimiz shart emas edi: matn konsolning o'zida paydo bo'ldi, lekin log4j kutubxonasidagi logger konsolga faqat XATO darajasidagi xabarlarni chiqarishi mumkin. Odamlar uchun matnli fayldan jurnallarni o'qish va jurnallarni bir xil fayllarda saqlash qulayroq. Loggerning standart xatti-harakatlarini o'zgartirish uchun biz fayl ilovasini sozlashimiz kerak . Boshlash uchun log4j.xml faylini to'g'ridan-to'g'ri src papkasida yoki Maven-dan foydalansangiz resurslar papkasida yoki Maven-dan foydalansangiz, resurslar papkasida yaratishingiz kerak . Siz xml formati bilan tanishsiz, yaqinda bu haqda ma'ruza o'tkazdik :) Uning mazmuni shunday bo'ladi:
<?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>
Bu unchalik murakkab ko'rinmaydi :) Ammo keling, tarkibni ko'rib chiqaylik.
<Configuration status="INFO">
Bu status-logger deb ataladigan narsa. Bu bizning loggerimiz bilan bog'liq emas va log4j tomonidan ichki ishlatiladi. Status=”INFO” o‘rniga status=“TRACE” ni o‘rnatishingiz mumkin va log4j ning ichki ishlashi haqidagi barcha ma’lumotlar konsolga chiqariladi (status-logger ma’lumotlarni konsolga chiqaradi, hatto dastur uchun ilovamiz fayl bo‘lsa ham. -asoslangan). Bizga endi bu kerak emas, shuning uchun hammasini avvalgidek qoldiramiz.
<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>
Bu erda biz ilovamizni yaratamiz. Teg <File>fayl bo'lishini bildiradi. name="MyFileAppender"- ilovachimiz nomi. fileName="C:\Users\Username\Desktop\testlog.txt"— barcha ma'lumotlar yoziladigan jurnal fayliga yo'l. append="true"— fayl oxiriga qo'shimcha ma'lumotlarni yozish zarurmi. Bizning holatlarimizda bu shunday bo'ladi. Agar false ga o'rnatilgan bo'lsa , dastur har safar qayta ishga tushirilganda eski jurnal tarkibi o'chiriladi. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Bu formatlash sozlamalari. Bu erda jurnalimizdagi matn formatini sozlash uchun oddiy iboralardan foydalanishimiz mumkin.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Bu erda biz ro'yxatga olish darajasini (ildiz darajasi) belgilaymiz. Bizda INFO darajasi o'rnatilgan: ya'ni INFO dan yuqori darajadagi barcha xabarlar (yuqorida ko'rib chiqqan jadvalga muvofiq) jurnalga kiritilmaydi. Bizning dasturimizda 3 ta xabar bo'ladi: bitta INFO, bitta OGOHLANTIRISH va bitta XATO. Joriy konfiguratsiya bilan barcha 3 ta xabar jurnalga yoziladi. Agar siz ildiz darajasini ERROR ga o'zgartirsangiz, LOGGER.error() dan faqat oxirgi xabar qayd qilinadi. Bundan tashqari, bu erda ilovaga havola joylashtirilgan. Bunday havolani yaratish uchun teg ichida <Root>teg yaratish <ApprenderRef>va unga parametr qo'shish kerak ref=”Name твоего аппендера”. Agar unutib qo'ysangiz, ilovaning nomini shu yerda yaratdik: <File name="MyFileAppender" Mana bizning dasturimiz kodi!
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("Ошибка! Произошло деление на ноль!");
       }
   }
}
Albatta, bu biroz egri (RuntimeException-ni ushlash - o'rtacha g'oya), lekin bu bizning maqsadlarimiz uchun juda mos keladi :) Keling, main()ketma-ket 4 marta usulimizni ishga tushiramiz va testlog.txt faylimizni ko'rib chiqamiz. Uni oldindan yaratishning hojati yo'q: kutubxona buni avtomatik ravishda amalga oshiradi. Hammasi ishladi! :) Endi sizda sozlangan logger bor. Siz ilgari yozgan ba'zi dasturlar bilan o'ynashingiz, barcha usullarga logger qo'ng'iroqlarini qo'shishingiz va natijada olingan jurnalga qarashingiz mumkin :) Qo'shimcha o'qish uchun men ushbu maqolani tavsiya qilaman . U yerda daraxt kesish mavzusi chuqur muhokama qilinadi va uni bir o‘tirishda o‘qish oson bo‘lmaydi. Ammo u juda ko'p foydali qo'shimcha ma'lumotlarni o'z ichiga oladi. Misol uchun, agar testlog.txt faylimiz ma'lum hajmga yetsa, yangi matn faylini yaratish uchun loggerni qanday sozlashni o'rganasiz :) Va shu bilan bizning darsimiz tugadi! Bugun siz juda muhim mavzuni bilib oldingiz va bu bilim kelajakdagi ishingizda albatta sizga foydali bo'ladi. Yana ko'rishguncha! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION