Log Level — tətbiqin müxtəlif mərhələlərində proqramçılara çıxarılan məlumatın həcmini idarə etməyə imkan verən, log mesajlarının kritiklik dərəcəsinə görə təsnifatı. Google Android Developers, 2024 məlumatlarına görə, loglama səviyyəsinin düzgün seçilməsi production-da logların həcmini 85–95% azaldır və səhv diaqnostikasını sürətləndirir. Hər bir səviyyə öz vəzifəsini həll edir — inkişaf mərhələsində debug-dan production-da kritik nasazlıqların monitorinqinə qədər.
Əsas məqamlar
Log Level — hər bir log mesajının əhəmiyyətini və emal təciliyini müəyyən edən atributdur. Müasir iOS və Android platformaları 6–7 səviyyədən ibarət vahid şkala dəstəkləyir: maksimum detallı (Verbose/Trace) dən kritik (Error/Assert) qədər. Səviyyənin seçimi tətbiqin cari konfiqurasiyasında mesajın loga yazılıb-yazılmayacağını müəyyən edir.
Log Level konsepsiyası kritiklik piramidası prinsipinə əsaslanır: səviyyə nə qədər yüksəkdirsə, o səviyyədə bir o qədər az mesaj çıxarılır. Semaphore CI, 2024 məlumatlarına görə, production tətbiqində paylama belə görünür: Info — 60% mesaj, Warn — 25%, Error — 10%, Debug — 5%. Verbose mesajları production-da tamamilə söndürülməlidir.
Hər bir platforma Log Level-i öz API-si vasitəsilə tətbiq edir. Android android.util.Log istifadə edir v(), d(), i(), w(), e() metodları ilə. Apple — OSLog default, info, debug, error, fault səviyyələri ilə. Timber və CocoaLumberjack kimi kitabxanalar bu standart API-lər üzərində əlavə funksionallıq qurur.
Google I/O 2023 məlumatlarına görə, Log Level-in səhv seçilməsi production-da performans problemlərinin 40%-nin səbəbidir. Proqramçılar Debug loglarını release qurmasında saxlayır ki, bu da diskə həddindən artıq yazıya və batareyanın sürətlənmiş boşalmasına gətirib çıxarır.
Verbose (TRACE) — yalnız inkişaf üçün nəzərdə tutulmuş ən detallı səviyyə. Bu səviyyədə bütün aralıq hesablamalar, dövr iterasiyaları, alqoritmin hər addımının nəticələri çıxarılır. Android-də bu səviyyəyə Log.v() uyğun gəlir, iOS-da — debug tipli OSLog (iOS 14-dən əvvəl os_trace istifadə olunurdu).
Debug — inkişaf və test zamanı faydalı olan debug mesajları. Əsas obyektlərin vəziyyəti, SQL sorğularının nəticələri, API çağırışlarının parametrləri haqqında məlumat ehtiva edir. Verbose-dan fərqli olaraq, Debug mesajları strukturlaşdırılmış və semantik əhəmiyyətlidir. iOS-da bu səviyyəyə OSLogType.debug uyğun gəlir.
Info — tətbiqin standart hadisələri haqqında məlumat mesajları: SDK-nın işə salınması, uğurlu avtorizasiya, ekranın açılması, serverdən məlumatın alınması. Info mesajları istifadəçilərin şəxsi məlumatlarını ehtiva etməməli və production təhlili üçün təhlükəsiz olmalıdır. iOS-da OSLogType.info, Android-də Log.i() istifadə olunur.
Warn — potensial problemlər barədə xəbərdarlıqlar. Tətbiq işləməyə davam edir, lakin vəziyyət diqqət tələb edir: keş ölçüsü limitə yaxınlaşır, API-nin köhnəlmiş versiyası, yavaş şəbəkə cavabı, təkrar qoşulma cəhdi. Android-də — Log.w(), iOS-da — OSLogType.default (xəbərdarlıqlar üçün).
Error — tətbiqin tələb olunan əməliyyatı yerinə yetirə bilmədiyi, lakin işləməyə davam etdiyi kritik səhvlər: API-ə uğursuz sorğu, əlaqənin kəsilməsi, verilənlər bazasına yazı xətası, icazələrin olmaması. iOS-da səhvlər üçün OSLogType.error, Android-də Log.e() istifadə olunur.
Assert (WTF) — „bu baş verə bilməz” vəziyyətini bildirən ən yüksək səviyyə. Sistemin fundamental invariantlarını pozan səhvlərin loglanması üçün istifadə olunur. Android-də Assert mesajları default olaraq release qurmalarında göstərilmir. iOS-da WTF (What a Terrible Failure) OSLogType.fault vasitəsilə işlənir.
Android Log API — android.util.Log paketindən daxili loglama mexanizmi. 6 statik metod təmin edir: Log.v(), Log.d(), Log.i(), Log.w(), Log.e() və Log.wtf(). Hər bir metod tag (mənbə identifikator sətri) və msg (mesaj mətni) qəbul edir.
class UserRepository {
companion object {
private val TAG = "UserRepo"
}
suspend fun loadUser(id: String): User {
Log.d(TAG, "İstifadəçi yüklənir: $id")
return try {
val response = api.fetchUser(id)
Log.i(TAG, "İstifadəçi uğurla yükləndi")
response.toUser()
} catch (e: Exception) {
Log.e(TAG, "İstifadəçi yüklənə bilmədi: ${e.message}")
throw e
}
}
}
Səviyyələrə görə filtrləmə Android Logcat-da ADB vasitəsilə həyata keçirilir: adb logcat *:E yalnız Error mesajlarını göstərəcək. Production qurmalarında bütün Log.v() və Log.d() çağırışları ProGuard/R8 tərəfindən minifikasiya aktiv olduqda silinir. Log.i(), Log.w() və Log.e() qalır, buna görə də həssas məlumatları bu metodlar vasitəsilə çıxarmamaq vacibdir.
Runtime-da xüsusi filtrləmə üçün Android Log.isLoggable(tag, level) — müəyyən tag üçün göstərilən səviyyənin aktiv olub-olmadığını yoxlayan metodu təqdim edir. Bu, tətbiqi yenidən qurmadan konkret modul üçün detallı loglamanı dinamik olaraq aktivləşdirməyə imkan verir.
OSLog — köhnəlmiş NSLog-u əvəz edən Apple-ın vahid loglama sistemi. OSLog 5 səviyyə təqdim edir: debug, info, default (notice), error və fault. Əsas üstünlük — formatlaşdırılmış sətirlər və konsol vasitəsilə dinamik filtrləmə dəstəyi ilə strukturlaşdırılmış loglamadır.
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)")
}
}
Filtrləmə sistemi OSLog əməliyyat sistemi səviyyəsində işləyir. Debug mesajları yalnız debugger qoşulduqda və ya -com.apple.CoreData.Logging.debug 1 arqumenti aktiv edildikdə yazılır. Info mesajları cihazın yaddaşında toplanır (512 KB-a qədər) və Console.app vasitəsilə əlçatandır. Error və fault daim yazılır və crash-reporting sistemləri vasitəsilə toplanmaq üçün əlçatandır.
OSLog-un mühüm xüsusiyyəti: placeholder-larla formatlaşdırılmış sətirlər. Swift sətir interpolyasiyası (həmişə, səviyyədən asılı olmayaraq hesablanır) əvəzinə, OSLog həssas məlumatları ayırmaq üçün %{public}@ və %{private}@ ilə os_log formatından istifadə edir. Private parametrlər production loglarında maskalanır.
Əsas qayda — production-da minimal səviyyə dəsti: Info, Warn, Error, Assert. Debug və Verbose söndürülməlidir. Səbəb təhlükəsizlikdən çox performansdadır: hər bir log çağırışı, hətta mesaj çıxarılmasa belə, sətrin formatlaşdırılması üçün prosessor vaxtı aparır.
Kritik optimallaşdırma — log çağırışlarında heç vaxt sətir interpolyasiyasından istifadə etməyin. Əgər sətir log() çağırışından əvvəl formalaşdırılırsa, prosessor vaxtı hətta söndürülmüş səviyyədə belə sərf olunur. Lambda və ya mühafizə şərtləri vasitəsilə tənbəl formatlaşdırmadan istifadə edin.
Android-də bu məqsədə Log.isLoggable() metodu, OSLog-da — placeholder-larla formatlaşdırılmış sətirlərin native dəstəyi xidmət edir. Android üçün Timber problemi timber.log.Tree vasitəsilə ağac daxilində səviyyə yoxlanışı ilə həll edir.
Remote Log Level — loglama səviyyəsinin Firebase Remote Config və ya oxşar xidmət vasitəsilə serverdən idarə olunduğu təcrübə. Production-da mürəkkəb səhv baş verərsə, proqramçı seçilmiş istifadəçi qrupunun cihazlarında konkret modul üçün Debug loglamasını uzaqdan aktivləşdirə bilər.
Firebase, 2024 məlumatlarına görə, bu təcrübə nadir səhvlərin diaqnostika vaxtını 60% azaldır və debug qurması quraşdırmadan problemin tam mənzərəsini əldə etməyə imkan verir. Əsas məhdudiyyət — loglar yalnız tətbiq konfiqurasiyanı aldıqdan sonra növbəti başlatmada aktivləşir.
BuildConfig.DEBUG Android-də və #if DEBUG Swift-də — release qurmalarında debug səviyyələrini söndürən standart şərti kompilyasiya mexanizmləri. Təmiz arxitektura üçün Log Level seçimini DI konteynerinə və ya logger fabrikinə çıxarmaq tövsiyə olunur ki, biznes məntiqi şərti direktivlərlə qarışmasın.
Birinci qayda — hər bir log çağırışı „kim, nə, nə vaxt” sualına cavab verməlidir. Kim — komponent və ya modul (Android-də tag, iOS-da category). Nə — konkret hadisə və ya vəziyyət dəyişikliyi. Nə vaxt — loglama sistemi tərəfindən avtomatik qoyulan zaman damğası.
İkinci qayda — həssas məlumatları Info və yuxarı səviyyələrdə loglamayın. Parollar, tokenlər, e-poçtlar, telefon nömrələri, dəqiq geo-koordinatlar — production-a düşən hər hansı logda qəti qadağandır. Lazım olduqda maskalamadan istifadə edin: “e-mail: us***@example.com”.
Üçüncü qayda — Warn səviyyəsi proqramçının məsuliyyət zonasıdır, Error — komandanın. Warn “buroda potensial problem var, izlə” deməkdir. Error — “buroda problem var, düzəlt”. Gözlənilən və işlənmiş vəziyyətlər üçün (məsələn, API 404 xətası) Error istifadə etməyin.
Dördüncü qayda — ardıcıllıq. Bütün layihə tag və kateqoriyaların adlandırılması üçün vahid konvensiyalardan istifadə etməlidir. Android tag-ları üçün ClassName.methodName, iOS kateqoriyaları üçün module.subsystem tövsiyə olunur. Bu, komponent üzrə logları tez filtrləməyə imkan verir.
Beşinci qayda — logları test edin. Vahid testlərdə müəyyən ssenarilərdə düzgün Log Level-in çağırıldığını yoxlayın. Bunun üçün mock loglama kitabxanaları mövcuddur: Android üçün Mockito, iOS üçün Cuckoo. Testlərdə səviyyələrin yoxlanılması debug mesajlarının production-a sızmasının qarşısını alır.
Tez-tez verilən suallar
Sürətlənmiş batareya boşalması və diskə həddindən artıq yazı. Hər bir Debug log sətri formatlaşdırır və məlumatı buferə yazır. Flash yaddaşlı cihazlarda bu, daşıyıcının aşınmasını sürətləndirir. Bundan əlavə, Debug logları production-da baxış üçün əlçatmaz olan həssas məlumatlar ehtiva edə bilər.
Debug — sorğu və cavabın gövdəsi, başlıqlar və status kodu üçün. Info — sorğunun yerinə yetirilməsi faktı üçün (URL, metod, müddət). Error — 4xx/5xx kodu ilə uğursuz sorğular üçün. Production-da şəbəkə logları üçün heç vaxt Verbose istifadə etməyin.
OSLogType.default (notice səviyyəsi) — orta əhəmiyyətli mesajlar, sistem logunda saxlanılır və Console.app-da görünür. OSLogType.info — texniki mesajlar, daimi saxlanılmır, yalnız Instruments vasitəsilə aktiv profilləmə zamanı əlçatandır.
R8/ProGuard release qurmasında minifikasiya aktiv olduqda Log.v() və Log.d()-ni silir. Log.i(), Log.w(), Log.e() saxlanılır. Bütün logların tam silinməsi üçün bütün səviyyələri göstərən xüsusi qayda -assumenosideeffects class android.util.Log tələb olunur.
Xeyr — həddindən artıq loglama oxunaqlılığı və performansı pisləşdirir. Girişi yalnız mürəkkəb və ya asinxron metodlarda loglayın. Sinxron metodlar üçün qayıdış və ya səhv nöqtəsində bir log kifayətdir. Çağırışların izlənməsi üçün Debug səviyyəsindən istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun