1.1 Ծանոթություն լոգերի հետ
Լոգ – դա տեղի ունեցած իրադարձությունների ցուցակ է։ Գրեթե ինչպես օրագիր։ Իսկ, համապատասխանաբար, լոգեր — դա օբյեկտ է, որի միջոցով կարելի է վարել լոգավորում։ Ծրագրավորման մեջ ընդունված է լոգավորել գրեթե ամեն ինչ։ Իսկ 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()
մեթոդը。
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ