Log Level — dasturchilarga ilovaning turli bosqichlarida chiqariladigan ma'lumot hajmini nazorat qilish imkonini beruvchi, log xabarlarining kritiklik darajasi bo'yicha tasnifi. Google Android Developers, 2024 ma'lumotlariga ko'ra, loglash darajasini to'g'ri tanlash production-da loglar hajmini 85–95% kamaytiradi va xatolarni aniqlashni tezlashtiradi. Har bir daraja o'z vazifasini hal qiladi — ishlab chiqish bosqichida disk raskadrovkadan production-da kritik nosozliklarni monitoring qilishgacha.
Asosiy fikrlar
Log Level — har bir log xabarining muhimligi va qayta ishlash shoshilinchligini belgilaydigan atribut. Zamonaviy iOS va Android platformalari 6–7 darajadan iborat yagona shkalani qo'llab-quvvatlaydi: maksimal batafsil (Verbose/Trace) dan kritik (Error/Assert) gacha. Darajani tanlash ilovaning joriy konfiguratsiyasida xabarning logga yozilishini aniqlaydi.
Log Level kontseptsiyasi kritiklik piramidasi printsipiga asoslanadi: daraja qanchalik yuqori bo'lsa, unda shunchalik kam xabarlar chiqariladi. Semaphore CI, 2024 ma'lumotlariga ko'ra, production ilovasida taqsimot quyidagicha ko'rinadi: Info — 60% xabarlar, Warn — 25%, Error — 10%, Debug — 5%. Verbose xabarlari production-da butunlay o'chirilishi kerak.
Har bir platforma Log Level ni o'z API si orqali amalga oshiradi. Android android.util.Log dan v(), d(), i(), w(), e() metodlari bilan foydalanadi. Apple — OSLog default, info, debug, error, fault darajalari bilan. Timber va CocoaLumberjack kabi kutubxonalar ushbu standart API lar ustiga qo'shimcha funksionallik qurishadi.
Google I/O 2023 ma'lumotlariga ko'ra, Log Level ni noto'g'ri tanlash production-da unumdorlik muammolarining 40% ga sabab bo'ladi. Dasturchilar Debug loglarini release yig'ilmasida qoldiradilar, bu esa diskka ortiqcha yozish va batareyaning tezlashtirilgan zaryadsizlanishiga olib keladi.
Verbose (TRACE) — faqat ishlab chiqish uchun mo'ljallangan eng batafsil daraja. Bu darajada barcha oraliq hisob-kitoblar, sikl iteratsiyalari, algoritm har bir qadamining natijalari chiqariladi. Android da bu darajaga Log.v() mos keladi, iOS da — debug tipidagi OSLog (iOS 14 gacha os_trace ishlatilgan).
Debug — ishlab chiqish va test paytida foydali bo'lgan disk raskadrovka xabarlari. Asosiy obyektlarning holati, SQL so'rovlarining natijalari, API chaqiruvlarining parametrlari haqida ma'lumot o'z ichiga oladi. Verbose dan farqli o'laroq, Debug xabarlari tuzilgan va semantik ahamiyatga ega. iOS da bu darajaga OSLogType.debug mos keladi.
Info — ilovaning odatdagi hodisalari haqida ma'lumot xabarlari: SDK ni ishga tushirish, muvaffaqiyatli avtorizatsiya, ekranni ochish, serverdan ma'lumot olish. Info xabarlari foydalanuvchilarning shaxsiy ma'lumotlarini o'z ichiga olmasligi va production tahlili uchun xavfsiz bo'lishi kerak. iOS da OSLogType.info, Android da Log.i() ishlatiladi.
Warn — potentsial muammolar haqida ogohlantirishlar. Ilova ishlashda davom etadi, ammo vaziyat e'tibor talab qiladi: kesh hajmi chegaraga yaqin, API ning eskirgan versiyasi, sekin tarmoq javobi, qayta ulanish urinishi. Android da — Log.w(), iOS da — OSLogType.default (ogohlantirishlar uchun).
Error — ilova so'ralgan operatsiyani bajara olmaydigan, ammo ishlashda davom etadigan kritik xatolar: API ga muvaffaqiyatsiz so'rov, ulanishning uzilishi, ma'lumotlar bazasiga yozish xatosi, ruxsatlarning yo'qligi. iOS da xatolar uchun OSLogType.error, Android da Log.e() ishlatiladi.
Assert (WTF) — „bu bo'lishi mumkin emas” holatini bildiruvchi eng yuqori daraja. Tizimning fundamental invariantlarini buzadigan xatolarni loglash uchun ishlatiladi. Android da Assert xabarlari sukut bo'yicha release yig'ilmalarida ko'rsatilmaydi. iOS da WTF (What a Terrible Failure) OSLogType.fault orqali qayta ishlanadi.
Android Log API — android.util.Log paketidan o'rnatilgan loglash mexanizmi. 6 statik metodni taqdim etadi: Log.v(), Log.d(), Log.i(), Log.w(), Log.e() va Log.wtf(). Har bir metod tag (manba identifikatori satri) va msg (xabar matni) ni qabul qiladi.
class UserRepository {
companion object {
private val TAG = "UserRepo"
}
suspend fun loadUser(id: String): User {
Log.d(TAG, "Foydalanuvchi yuklanmoqda: $id")
return try {
val response = api.fetchUser(id)
Log.i(TAG, "Foydalanuvchi muvaffaqiyatli yuklandi")
response.toUser()
} catch (e: Exception) {
Log.e(TAG, "Foydalanuvchini yuklash muvaffaqiyatsiz tugadi: ${e.message}")
throw e
}
}
}
Darajalar bo'yicha filtrlash Android Logcat da ADB orqali amalga oshiriladi: adb logcat *:E faqat Error xabarlarini ko'rsatadi. Production yig'ilmalarida barcha Log.v() va Log.d() chaqiruvlari ProGuard/R8 tomonidan minifikatsiya yoqilganda o'chiriladi. Log.i(), Log.w() va Log.e() qoladi, shuning uchun nozik ma'lumotlarni ushbu metodlar orqali chiqarmaslik muhim.
Runtime da maxsus filtrlash uchun Android Log.isLoggable(tag, level) — berilgan tag uchun ko'rsatilgan daraja yoqilganligini tekshiruvchi metodni taqdim etadi. Bu ilovani qayta qurmasdan ma'lum modul uchun batafsil loglashni dinamik ravishda yoqish imkonini beradi.
OSLog — eskirgan NSLog o'rnini bosgan Apple ning yagona loglash tizimi. OSLog 5 darajani taqdim etadi: debug, info, default (notice), error va fault. Asosiy afzallik — formatlangan satrlar va konsol orqali dinamik filtrlashni qo'llab-quvvatlovchi tuzilgan loglash.
import OSLog
let logger = Logger(
subsystem: "com.example.app",
category: "network"
)
func fetchData(from url: URL) {
logger.debug("Starting request to \(url.absoluteString)")
do {
let data = try Data(contentsOf: url)
logger.info("Received \(data.count) bytes")
} catch {
logger.error("Request failed: \(error.localizedDescription)")
}
}
Filtrlash tizimi OSLog operatsion tizim darajasida ishlaydi. Debug xabarlari faqat debugger ulanganda yoki -com.apple.CoreData.Logging.debug 1 argumenti yoqilganda yoziladi. Info xabarlari qurilma xotirasida to'planadi (512 KB gacha) va Console.app orqali mavjud. Error va fault doimiy ravishda yoziladi va crash-reporting tizimlari orqali yig'ish uchun mavjud.
OSLog ning muhim xususiyati: placeholder li formatlangan satrlar. Swift satr interpolyatsiyasi (har doim, darajadan qat'iy nazar hisoblanadi) o'rniga, OSLog nozik ma'lumotlarni ajratish uchun %{public}@ va %{private}@ bilan os_log formatidan foydalanadi. Private parametrlar production loglarida maskalanadi.
Asosiy qoida — production da minimal darajalar to'plami: Info, Warn, Error, Assert. Debug va Verbose o'chirilishi kerak. Sabab xavfsizlik emas, balki unumdorlik: har bir log chaqiruvi, hatto xabar chiqarilmasa ham, satrni formatlash uchun protsessor vaqtini oladi.
Kritik optimallashtirish — log chaqiruvlarida hech qachon satr interpolyatsiyasidan foydalanmang. Agar satr log() chaqiruvidan oldin shakllantirilsa, protsessor vaqti hatto o'chirilgan darajada ham sarflanadi. Lambda yoki himoya shartlari orqali dangasa formatlashdan foydalaning.
Android da bu maqsadga Log.isLoggable() metodi, OSLog da — placeholder li formatlangan satrlarning native qo'llab-quvvatlanishi xizmat qiladi. Android uchun Timber muammoni timber.log.Tree orqali daraxt ichida darajani tekshirish bilan hal qiladi.
Remote Log Level — loglash darajasi Firebase Remote Config yoki shunga o'xshash xizmat orqali serverdan boshqariladigan amaliyot. Agar production da murakkab xato yuz bersa, dasturchi tanlangan foydalanuvchilar guruhining qurilmalarida ma'lum modul uchun Debug loglashni masofadan yoqishi mumkin.
Firebase, 2024 ma'lumotlariga ko'ra, bu amaliyot noyob xatolarni aniqlash vaqtini 60% ga kamaytiradi va debug yig'ilmasini o'rnatmasdan muammoning to'liq rasmini olish imkonini beradi. Asosiy cheklov — loglar faqat konfiguratsiya olingandan keyin ilovaning navbatdagi ishga tushirilishida yoqiladi.
BuildConfig.DEBUG Android da va #if DEBUG Swift da — release yig'ilmalarida disk raskadrovka darajalarini o'chiruvchi standart shartli kompilyatsiya mexanizmlari. Toza arxitektura uchun Log Level tanlashni DI konteyneriga yoki logger fabrikasiga chiqarish tavsiya etiladi, shunda biznes mantiq shartli direktivalar bilan aralashmasin.
Birinchi qoida — har bir log chaqiruvi „kim, nima, qachon” degan savolga javob berishi kerak. Kim — komponent yoki modul (Android da tag, iOS da category). Nima — konkret hodisa yoki holat o'zgarishi. Qachon — loglash tizimi tomonidan avtomatik qo'yiladigan vaqt belgisi.
Ikkinchi qoida — nozik ma'lumotlarni Info va undan yuqori darajalarda loglamang. Parollar, tokenlar, elektron pochtalar, telefon raqamlari, aniq geo-koordinatalar — production ga tushadigan har qanday logda qat'iyan man etiladi. Zarur bo'lganda maskalashdan foydalaning: „email: us***@example.com”.
Uchinchi qoida — Warn darajasi dasturchining mas'uliyat zonasi, Error — jamoaning. Warn „bu yerda potentsial muammo bor, kuzat” degani. Error — „bu yerda muammo bor, tuzat”. Kutilgan va qayta ishlangan holatlar uchun (masalan, API 404 xatosi) Error dan foydalanmang.
To'rtinchi qoida — izchillik. Butun loyiha tag va kategoriyalarni nomlash uchun yagona konvensiyalardan foydalanishi kerak. Android taglari uchun ClassName.methodName, iOS kategoriyalari uchun module.subsystem tavsiya etiladi. Bu komponent bo'yicha loglarni tez filtrlash imkonini beradi.
Beshinchi qoida — loglarni sinab ko'ring. Unit testlarda ma'lum stsenariylarda to'g'ri Log Level chaqirilganligini tekshiring. Buning uchun mock loglash kutubxonalari mavjud: Android uchun Mockito, iOS uchun Cuckoo. Testlarda darajalarni tekshirish disk raskadrovka xabarlarining production ga sizib chiqishini oldini oladi.
Tez-tez beriladigan savollar
Tezlashtirilgan batareya zaryadsizlanishi va diskka ortiqcha yozish. Har bir Debug log satrni formatlaydi va ma'lumotni buferga yozadi. Flash xotirali qurilmalarda bu yuritkichning eskirishini tezlashtiradi. Bundan tashqari, Debug loglari production da ko'rish uchun mavjud bo'lmagan nozik ma'lumotlarni o'z ichiga olishi mumkin.
Debug — so'rov va javob tanasi, sarlavhalar va status kodi uchun. Info — so'rovning bajarilish fakti uchun (URL, metod, davomiylik). Error — 4xx/5xx kodi bilan muvaffaqiyatsiz so'rovlar uchun. Production da tarmoq loglari uchun hech qachon Verbose dan foydalanmang.
OSLogType.default (notice darajasi) — o'rtacha muhimlikdagi xabarlar, tizim logida saqlanadi va Console.app da ko'rinadi. OSLogType.info — texnik xabarlar, doimiy saqlanmaydi, faqat Instruments orqali faol profillash paytida mavjud.
R8/ProGuard minifikatsiya yoqilganda release yig'ilmasida Log.v() va Log.d() ni olib tashlaydi. Log.i(), Log.w(), Log.e() saqlanadi. Barcha loglarni to'liq olib tashlash uchun barcha darajalarni ko'rsatuvchi maxsus qoida -assumenosideeffects class android.util.Log talab qilinadi.
Yo'q — haddan tashqari loglash o'qish qulayligi va unumdorlikni yomonlashtiradi. Kirishni faqat murakkab yoki asinxron metodlarda loglang. Sinxron metodlar uchun qaytish yoki xato nuqtasida bitta log yetarli. Chaqiruvlarni kuzatish uchun Debug darajasidan foydalaning.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.