JavaRush /Курсы /All lectures for AM purposes /Ինչու են անհրաժեշտ լոգերը Java-ում

Ինչու են անհրաժեշտ լոգերը Java-ում

All lectures for AM purposes
1 уровень , 367 лекция
Открыта

1.1 Ծանոթություն լոգերի հետ

Լոգ – դա տեղի ունեցած իրադարձությունների ցուցակ է։ Գրեթե ինչպես օրագիր։ Իսկ, համապատասխանաբար, լոգեր — դա օբյեկտ է, որի միջոցով կարելի է վարել լոգավորում։ Ծրագրավորման մեջ ընդունված է լոգավորել գրեթե ամեն ինչ։ Իսկ Java-ում՝ նույնիսկ ավելին ու ավելի չափազանցված։

logger java

Բացատրեմ այսպես, Java-ի ծրագրերը՝ շատ հաճախ մեծ սերվերային հավելվածներ են առանց UI-ի և կոնսուլի։ Նրանք միաժամանակ մշակվող դիմումներ հազարավոր օգտագործողների և հաճախ դրանք սխալներ են ծագում։ Հատկապես, երբ տարբեր թելեր սկսում են միջամտել միմյանց։

Եվ, փաստորեն, հազվադեպ վերարտադրվող սխալները և խափանումները փնտրելու միակ եղանակը այսպիսի իրավիճակում լոգ/ֆայլում ամեն ինչ գրանցվելն է, ինչը կատարվում է յուրաքանչյուր թելի մեջ։

Ամենահաճախ լոգում գրանցվում է տեղեկատվությունը մեթոդի վերաբերյալ, որոնցից նա կանչվել է, բոլոր բռնված սխալները, և շատ միջանկյալ տեղեկատվություն։ Որքան լիարժեք է լոգը, այնքան ավելի հեշտ է վերականգնել իրադարձությունների հերթականությունը և հետևել խափանման կամ սխալի առաջացման պատճառները։

Բայց որքան մեծ է լոգը, այնքան դժվար է նրա հետ աշխատել։ Երբեմն լոգերը հասնում են մի քանի գիգաբայթ օրական։ Դա նորմալ է։

1.2 Անհաջող լոգեր

Առաջին լոգերի համար ծրագրավորողները պարզապես կոնսուլում ցուցադրություն էին օգտագործում։ Դա հարմար է գաղտնազերծման ժամանակ՝ երբ կոնսուլում գրանցվում է բոլոր կարևոր տեղեկատվությունն ու փոփոխականների արժեքները։ Բայց այսպիսի լոգը բոլորովին անհարթ է սովորական աշխատանքի ժամանակ։

Նախ և առաջ, հավելվածը կարող է ցանկանալ ինքն իրեն ինչ-որ բան ցուցադրել կոնսուլում, և օգտատերը բոլորովին չի ցանկանա տեսնել ծառայությունների տեղեկատվությունը, որը նախատեսված է ծրագրավորողի համար։

Երկրորդ, կոնսուլի բուֆերի չափը սահմանափակ է, շատ բան չի կարող գրել այնտեղ։

Եվ վերջապես, երրորդ, ծրագրի սխալների մասին տեղեկատվությունը, որը հավաքվում է շատ ժամանակի ընթացքում, պետք է ուղարկել ծրագրի մշակողներին։ Եվ ամենահարմարն է գրել այս ամբողջ տեղեկատվությունը միանգամից ֆայլում։

Առաջին խնդիրը ծրագրավորողները արագ լուծեցին՝ հորինեցին ևս մեկ ելքի հոսք՝ System.err։ Դուք կարող եք այնտեղ գրանցել հաղորդագրություններ և դրանք կուղարկվեն առանձին հոսքի, ոչ թե սովորական կոնսուլի։

Եվ նույնիսկ ֆայլում գրանցման խնդիրը նույնպես լուծել կարողացան։


// Սահմանում ենք ֆայլը, որտեղ կգրենք լոգը
System.setErr(new PrintStream(new File("log.txt")));
// Ցուցադրում ենք հաղորդագրությունները
System.err.println("Հաղորդագրություն 1");
System.err.println("Հաղորդագրություն 2");
// Ցուցադրում ենք սխալի մասին հաղորդագրությունը
try {
    throw new Exception("Սխալի հաղորդագրություն");
} catch (Exception e) {
    e.printStackTrace();
}

Բայց նույնիսկ այսպիսի տեսքով, սա չէր լուծում ամբողջ խնդիրը, այդպես որոշվեց ստեղծել հատուկ գրադարան, որը կգրեր հաղորդագրության լոգը ֆայլում։ Նա դա անում էր խելացի ձևով և թույլ էր տալիս ճկուն ձևով կարգավորել լոգավորվող իրադարձությունների և տվյալների ֆիլտրերը։

Լոգավորման ամբողջ գործընթացը, ըստ էության, բաղկացած է երեք մասերից:

  • Առաջինը՝ տեղեկատվության հավաքագրմամբ
  • Երկրորդը՝ հավաքագրված տեղեկատվության ֆիլտրով
  • Երրորդը՝ ընտրված տեղեկատվության գրառումով

1.3 Ծանոթություն log4j լոգերի հետ

Java համայնքում առաջին հանրահայտ լոգերը դարձավ log4j։ Նրան միացնել ձեր նախագծում շատ հեշտ է, դրա համար պետք է ընդամենը մի քանի տող ավելացնել ձեր pom.xml-ում։


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

Քո ծրագրի փոխազդեցությունը այդպիսի լոգերի հետ կլիներ մոտավորապես այսպես։


class Manager {
 private static final Logger logger = LoggerFactory.getLogger(Manager.class);

    public boolean processTask(Task task) {
  logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
  logger.error("Unknown error", e);
            return false;
        }
    }
}

Այստեղ տեղի են ունենում երեք բան։

Կանաչով նշված է Logger օբյեկտի ստեղծումը։ Նրա օբյեկտը պահվում է ստատիկ փոփոխականում, որպեսզի հետագայում հարմար լինի աշխատել դրա հետ։ Ինչպես նաև getLogger() մեթոդին փոխանցվում է ինֆորմացիա այն դասի մասին, որտեղ տեղի է ունենում տեղեկատվության հավաքագրումը։

Կապույտով նշված է տողը, որտեղ մենք լոգում ենք տեղեկատվություն, որը արժեք ունի միայն դեբագի ժամանակ։ Դրա համար օգտագործվում է հատուկ մեթոդ՝ debug()

Եվ վերջապես, կարմիրով նշված է տողը, որտեղ մենք լոգում ենք առաջացած բացառությունները։ Բացառությունները՝ պոտենցիալ սխալներ են, ուստի լոգում գրանցելու համար օգտագործվում է error() մեթոդը。

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ