3.1 Voqealar darajalari ro'yxati
Loglash – bu dastur ishlash vaqtida sodir bo'ladigan voqealarni qayd etish jarayoni. Dasturchi sifatida sening vazifang — muhim narsalarni qayd etish, chunki keyinchalik, productionda g'alati va/yoki jiddiy xatolar bo'lganda, bu loglardan boshqa hech narsa qolmaydi.
Har qanday xato ancha tezroq tuzatiladi, agar sen uni va chaqiruvlar tarixini to'liq bilsang. Lekin shundan oddiy bir xulosa chiqadi – hamma narsani loglash kerak emas: barcha metod chaqiruvlarini, barcha parametr qiymatlarini loglash.
Bu ham yechim emas – juda ko'p ma'lumotlar ham, juda kam ma'lumotlar kabi yomon. Bizga aqlli loglash kerak. Inson uchun inson tomonidan yaratilgan. Va bu erda biz loglash haqidagi birinchi faktga kelamiz – logdagi barcha yozuvlar yaratilayotgan paytdayoq kategoriyalarga bo'linadi.
Dasturchi, biron bir voqeani logga yozayotganda, uning qanchalik muhimligini hal qilishlari kerak. Voqeani qay darajada muhimligini xabar muallifi tanlaydi. log4jda loglash ma'lumotlarining 5 darajasi mavjud:
DEBUGINFOWARNERRORFATAL
Quyida ularni batafsilroq tushuntiramiz.
3.2 DEBUG
DEBUG darajasi eng kam muhim hisoblanadi. Bunday muhimlik darajasi bilan logga yozilgan ma'lumot faqat dastur debugging jarayonida kerak bo'ladi. Debug paytida kerakli ma'lumotlarni logga yozish uchun debug() metodidan foydalaniladi.
Misol:
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("Noma'lum xato", e);
return false;
}
}
}
E'tibor ber, debug metodi metodning boshida joylashgan (metod hali biror narsa qilmadi) va metodga kiruvchi o'zgaruvchining qiymatini logga yozadi. Bu debug() metodidan foydalanishning eng keng tarqalgan stsenariysidir.
3.3 INFO va WARN
Keyingi ikkita daraja – bu INFO va WARN. Ular uchun ikki metod mavjud – info() va warn().
INFO darajasi faqat ma'lumotnoma xabarlar uchun qo'llaniladi: falon narsa sodir bo'lmoqda. Logda xatoni tahlil qilishni boshlaganingizda, uning tarixi bilan tanishib chiqish juda foydali bo'lishi mumkin. Buning uchun info() metodi juda mos keladi.
WARN darajasi ogohlantirishlarni yozish uchun qo'llaniladi (warning so'zidan). Odatda, bunday muhimlik darajasida bitta narsa noto'g'ri ketdi, lekin dastur ushbu vaziyatda qanday harakat qilishni biladi.
Masalan, faylni diskka yozish jarayonida bunday fayl allaqachon mavjudligi aniqlanadi. Bu erda dastur logga ogohlantirishni yozishi mumkin, lekin foydalanuvchiga dialog oynasi ko'rsatib, boshqa fayl nomini tanlashni taklif qilishi mumkin.
Misol:
class FileManager {
private static final Logger logger = LoggerFactory.getLogger(FileManager.class);
public boolean saveFile(FileData file) {
logger.info("faylni saqlayapmiz " + file.getName());
boolean resultOK = SaveUtils.save(file);
if (resultOK) return true;
logger.warn("faylni yozishda muammo " + file.getName());
String filename = Dialog.selectFile();
boolean result = SaveUtils.save(file, filename);
return result;
}
3.4 ERROR va FATAL
Va nihoyat, loglashdagi eng muhim ikki daraja – ERROR va FATAL. Ular uchun ham nom bilan bir xil metodlar mavjud: error() va fatal().
Xatolar ham ikkita kategoriyaga bo'linishga qaror qilindi – oddiy xatolar va o'limga olib keluvchi xatolar. O'limga olib keluvchi xato ko'pincha dasturiy ta'minotning avariya bilan yopilishiga (desktop ilovalar uchun) yoki veb-xizmatning qulashiga (veb-ilovalar uchun) olib keladi.
Yana bir yaxshi misol – bu Windows operatsion tizimi. Agar dastur shunchaki qulab tushsa, operatsion tizim nuqtai nazaridan bu Error hisoblanadi. Va agar operatsion tizimning o'zi qulab tushsa va Windows'ning ko'k ekranini ko'rsangiz, bu albatta Fatal error.
Java-dasturlarda ko'pincha Error va Fatal hodisalari yuzaga kelgan istisnolar bilan bog'liq. Misol:
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("Noma'lum xato", e);
return false;
}
}
}
3.5 Nimalarni loglash kerak
Albatta, hamma narsani loglash kerak emas. Ko'p hollarda bu logning o'qimishliligini keskin yomonlashtiradi, axir log birinchi navbatda o'qish uchun yoziladi.
Bundan tashqari, logga turli shaxsiy va moliyaviy ma'lumotlarni yozish mumkin emas. Hozirda bu bilan qattiq va osongina jarima yoki sud jarayonlariga duch kelishingiz mumkin. Ertami-kechmi bunday log yon tomonga o'tib ketadi va keyin muammolar ko'payadi.
Xo'sh, nima loglash kerak?
Birinchidan, dastur ishini boshlanishini loglash kerak. Dastur ishga tushgandan so'ng, uning ish rejimini va turli muhim sozlamalarni logda chiqish tavsiya etiladi – bu kelajakda logni o'qishni osonlashtiradi.
Ikkinchidan, uchinchi tomon xizmatlarining holatini loglash kerak, bu sizning dasturingiz bilan ishlaydi: pochta tizimlari, har qanday tashqi xizmatlar. Eng kamida, ularga ulanadigan lahzani loglash kerak, ularga oddiy ishlashi haqida ishonch hosil qilish uchun.
Uchinchidan, barcha istisnolarni loglash kerak. Agar ular kutilayotgan bo'lsa, ularni qisqacha yozish mumkin. Istisnolar bo'yicha to'liq ma'lumotlar xatoni topishda 50%dan 80%gacha muhim ma'lumotlar beradi.
Shuningdek, dastur ishini tugatishni loglash kerak. Dastur to'g'ri tugatilishi va logga o'nlab xatolar tushmasligi kerak. Odatda bu yerda osilib qolgan vazifalarni, oqimlar havzasi bilan bog'liq muammolarni yoki vaqtinchalik fayllarni o'chirish muammolarini topish mumkin.
Foydalanuvchining xavfsizligi va avtorizatsiyasi bilan bog'liq narsalarni albatta logda yozing. Agar foydalanuvchi parolni 10 marta ketma-ket qayta urinishga tushib qolsa, ushbu ma'lumotlar loglarda ko'rsatilishi kerak.
Asinxron vazifalar bo'yicha maksimal ma'lumotlarni logda yozing – bu oqimlar ichidagi ko'pincha istisnolar yo'qoladi. Asinxron vazifa bo'yicha, uning boshlanishini va tugatilishini logingizda yozib boring. Muvaffaqiyatli tugatilishini muammoli holatdagidek logda yozish kerak.
Yana nima? Vaqt o'lchash bo'yicha bajariladigan vazifalarni ishga tushirish, SQL-protseduralarni ishga tushirish, ma'lumotlarni sinxronlashtirish, taqsimlangan tranzaktsiyalar bilan bog'liq bo'lgan barcha narsalar. Dastlab bu yetarli bo'ladi deb o'ylayman. Kelajakda bu ro'yxatni o'zing to'ldirib yurasan.
GO TO FULL VERSION