Structured Logging — bu har bir xabar kalit-qiymat juftliklari bilan mashina o'qiy oladigan formatda taqdim etiladigan, tuzilmagan matn o'rniga log yozish usulidir. Yassi satrlardan farqli o'laroq, tuzilgan loglar metama'lumotlarni o'z ichiga oladi: timestamp, daraja, modul, so'rov identifikatori — va tahlil tizimlari tomonidan indekslanishi mumkin. O'Reilly Effective Logging ma'lumotlariga ko'ra, tuzilgan formatlarga o'tish hodisalarni qidirish vaqtini soatlardan daqiqalarga qisqartiradi, chunki maydonlar bo'yicha filtrlash imkoniyati mavjud. Bu zamonaviy mobil va server ishlanmasida de-fakto standartdir: JSON va logfmt loglarni dasturlar bilan qayta ishlashga imkon beradi, ko'z bilan emas.
Asosiy
Structured Logging — har bir xabar tipli qiymatlar bilan nomlangan maydonlarni o'z ichiga olgan log yozish usulidir. User 42 logged in from device ABC kabi satr o'rniga tuzilgan log maydonlar to'plami sifatida ko'rinadi: user_id=42, event=login, device_id=ABC, timestamp=2026-07-04T10:30:00Z.
Tuzilgan loglarning matnli loglardan asosiy ustunligi — dasturiy qayta ishlash imkoniyati. Matnli loglarni pars qilish muntazam ifodalar va satr formati haqidagi taxminlarni talab qiladi. Tuzilgan loglar yo'qotishlarsiz pars qilinadi: har bir maydon ma'lum tur va nomga ega, bu qo'shimcha qayta ishlashsiz oxirgi soat ichida foydalanuvchi 42 uchun barcha avtorizatsiya xatolarini top darajasidagi so'rovlarni qurish imkonini beradi.
Honeycomb.io (2023) ma'lumotlariga ko'ra, ishlab chiqarishda structured logging ishlatadigan jamoalar hodisalarni matnli loglar va grep-ga tayanadigan jamoalarga nisbatan o'rtacha 4 marta tezroq aniqlaydi.
Structured Logging bir nechta serializatsiya formatlarini qo'llab-quvvatlaydi. Formatni tanlash infratuzilmaga bog'liq: JSON Elasticsearch va bulut tizimlari bilan integratsiya uchun qulay, logfmt — tail va grep orqali konsol ko'rinishi uchun, Protocol Buffers — yuqori unumli, o'tkazish qobiliyati cheklangan tizimlar uchun.
| Format | Misol | Qachon ishlatiladi |
|---|---|---|
| JSON | {"event":"login","user_id":42} | ELK Stack, bulut yig'uvchilari, mikrosxizmatlar |
| Logfmt | event=login user_id=42 duration_ms=150 | Konsol, tail, heroku logs |
| MessagePack | JSON-ning ikkilik ekvivalenti | Yuqori yuklangan tizimlar, IoT |
JSON tuzilgan loglar uchun eng keng tarqalgan formatdir. Barcha yig'ish tizimlari tomonidan mahalliy qo'llab-quvvatlanadi: Logstash, Fluentd, Amazon CloudWatch, Google Cloud Logging. JSON loglari odam tomonidan oson o'qiladi va qo'shimcha kutubxonalarsiz har qanday dasturlash tili bilan pars qilinadi. Asosiy kamchilik — ortiqchalik: har bir kalit-qiymat juftligi qo'shtirnoq va ikki nuqtani talab qiladi, bu saqlanadigan ma'lumotlar hajmini logfmt-ga nisbatan 30–50% oshiradi.
Logfmt Heroku-da konsol ko'rinishi uchun ishlab chiqilgan. JSON-dan ixchamroq, odam o'qish qobiliyatini saqlaydi va cut va awk bilan oson kesiladi. Misol: ts=2026-07-04T10:30:00Z level=error module=api status=500. Logfmt ko'pchilik belgilarni ekranlashtirishni talab qilmaydi va konteynerlarda stdout-loglash uchun yaxshi mos keladi.
Mobil ilovalarda Structured Logging uchta asosiy vazifani hal qiladi: qurilmada takrorlanmasdan nosozlik sabablarini topish, foydalanuvchi sessiyalarini kuzatish va ilova versiyalari bo'yicha unumdorlikni tahlil qilish.
Mobil qurilmalarda matnli loglar deyarli foydasiz — dasturchi foydalanuvchi qurilmasida loglarni grep qila olmaydi. Tuzilgan loglar bulut tizimlariga (Firebase, Sentry, Datadog) yuboriladi va u erda indekslanadi. So'rov qurish mumkin: iOS 17.4 dagi barcha crash-larni ko'rsat, ilova versiyasi 3.2, checkouts modulida — va bir necha soniya ichida aniq tanlovni olish.
Sentry (2024) ma'lumotlariga ko'ra, structured breadcrumbs ishlatadigan ilovalar faqat xato matnini loglaydigan ilovalarga nisbatan har bir crash hisobotida 60% ko'proq kontekstga ega. Bu to'g'ridan-to'g'ri xatoni tuzatish tezligiga ta'sir qiladi.
ELK Stack — Elasticsearch, Logstash, Kibana — tuzilgan loglar bilan ishlash uchun standart infratuzilma bo'lib qolmoqda. Logstash loglarni JSON-da qabul qiladi, o'zgartiradi va indekslash uchun Elasticsearch-ga yuboradi, Kibana so'rovlar va dashboardlar uchun vizual interfeysni taqdim etadi.
Mobil ilovalar uchun bulutli yechimlar mashhur: Firebase Crashlytics maxsus loglar bilan, Sentry breadcrumbs bilan, Datadog APM kuzatuvi bilan. Ular tuzilgan loglarni to'g'ridan-to'g'ri mobil SDK-dan qabul qiladi va o'z backend-ni joylashtirishni talab qilmaydi. Firebase crash hisobotlari uchun bepul paketni taklif qiladi, Sentry distributed tracing qo'shadi, Datadog esa bir vaqtning o'zida mijoz va serverda so'rov unumdorligini kuzatish uchun APM bilan integratsiyalanadi.
Grafana Loki — loglar uchun optimallashtirilgan Elasticsearch alternativi. Loki sukut bo'yicha xabarlar mazmunini indekslamaydi, filtrlash uchun teglardan (labels) foydalanadi. Bu saqlashda ancha arzon va belgilangan maydonlar to'plami bo'yicha so'rovlarda tezroq.
// Structured logging Swift Logger orqali JSON-da
struct StructuredLog {
let event: String
let attributes: [String: Any]
let level: String
func serialize() -> String {
var base = "event=\(event) level=\(level)"
for (key, value) in attributes {
base += " \(key)=\(value)"
}
return base
}
}
Tuzilgan loglashning birinchi qoidasi: har bir xabar so'rov yoki sessiya identifikatorini o'z ichiga olishi kerak. Kontekstsiz, yagona log foydasiz — qaysi foydalanuvchi yoki so'rovga tegishli ekanligini tushunish mumkin emas. Sessiya boshida correlation ID qo'shing va uni ilovaning barcha qatlamlari orqali o'tkazing.
Ikkinchi qoida: maydonlarni tiplash. Raqamli maydonlar (duration_ms, status_code, retry_count) satr sifatida emas, raqam sifatida uzatilishi kerak. Elasticsearch va shunga o'xshash tizimlar raqamlar va satrlarni turlicha indekslaydi: raqamlarga agregatsiyalar (o'rtacha, mediana, persentil) qo'llanilishi mumkin, satrlarga — to'liq matnli qidiruv. Soxta tiplash analitik dashboardlar qurish imkoniyatini yo'qotadi.
Uchinchi qoida: ichma-ich obyektlardan saqlaning. 2 darajadan chuqur ichma-ich JSON loglarini filtrlash va vizuallashtirish qiyin. {"user": {"name": "Alice", "role": "admin"}} o'rniga yassi kalitlardan foydalaning: user_name=Alice user_role=admin.
// Structured logging Android-da Timber + logfmt orqali
class StructuredTree : Timber.Tree() {
override fun log(priority: Int, tag: String?,
message: String?, t: Throwable?) {
val level = priorityToLevel(priority)
val logfmt = "level=$level tag=$tag message=$message"
sendToRemote(logfmt)
}
}
Har bir tuzilgan xabar uchun minimal maydonlar to'plami: timestamp ISO 8601 formatida, level (debug/info/warn/error/fatal), logger (modul yoki sinf nomi), message (hodisaning odam o'qiy oladigan tavsifi). Qo'shimcha: correlation_id, user_id (agar ma'lum bo'lsa), version (ilova versiyasi), platform (iOS/Android), environment (dev/staging/prod).
Correlation ID bo'lmasa tuzilgan loglar bir foydalanuvchi ssenariysida birlashtirib bo'lmaydigan tarqoq yozuvlar to'plamiga aylanadi. Har bir ilova ishga tushirilganda UUID yarating va uni barcha sessiya loglariga qo'shing. Amalda correlation ID barcha qatlamlardan o'tkazilishi kerak: UI hodisalaridan tarmoq so'rovlari va fon vazifalarigacha — aks holda loglarning bir qismi kontekstsiz qoladi va analitikada ishtirok etmaydi. Uchidan-uchiga kuzatishda bitta UUID foydalanuvchi yo'lining to'liq rasmini to'plash imkonini beradi.
iOS-da tuzilgan loglash os_log ustidagi maydonlarni logfmt formatiga seriyalashtiradigan o'rash orqali amalga oshirilishi mumkin. Android-da — serverga yuborishdan oldin xabarlarni JSON yoki logfmt-ga aylantiradigan maxsus Tree bilan Timber orqali.
import OSLog
struct StructuredLogger {
let subsystem: String
let category: String
func log(level: OSLogType,
event: String,
context: [String: Any]) {
let oslogger = Logger(
subsystem: subsystem,
category: category
)
let fields = context.map {
"\($0.key)=\($0.value)"
}.joined(separator: " ")
oslogger.log(level: level,
"\(event) \(fields)")
}
}
Tuzilgan va matnli loglar o'rtasidagi tanlov loyiha bosqichiga bog'liq. Dastlabki rivojlanish bosqichlarida matnli loglar sodda va tezroq — dasturchi xabarni to'g'ridan-to'g'ri qo'shimcha o'rashlarsiz yozadi. Ammo loyiha bir jamoa yoki bir server chegarasidan chiqishi bilan tuzilgan loglar majburiy bo'ladi.
| Mezon | Matnli loglar | Tuzilgan loglar |
|---|---|---|
| O'qish qulayligi | Konsolda yuqori | O'rtacha (pretty-print talab qiladi) |
| Qidiruv | Pastki satr bo'yicha grep | Maydonlar va qiymatlar bo'yicha so'rovlar |
| Agregatsiya | Qo'llab-quvvatlanmaydi | O'rtacha, mediana, persentillar |
| Integratsiya | Pars qilishni talab qiladi | ELK/Loki/Datadog-da mahalliy |
| Saqlash hajmi | Kamroq (metama'lumotsiz) | Ko'proq (maydonlar + qiymatlar) |
Tez-tez so'raladigan savollar
Serverga yuborish uchun JSON dan foydalaning — u Firebase Crashlytics, Sentry va Datadog tomonidan mahalliy qo'llab-quvvatlanadi. Xcode yoki Android Studio loglarida mahalliy ko'rish uchun logfmt dan foydalaning — u ixchamroq va formatlashsiz o'qiladi.
Ha, mijoz tomondagi tuzilgan loglar har bir crash hisobotiga kontekst qo'shish imkonini beradi: OT versiyasi, tarmoq holati, foydalanuvchining so'nggi harakatlari. Tuzilgan breadcrumbs bo'lmasa, crash hisobotida foydalanuvchi ssenariysiz faqat chaqiruvlar steki mavjud.
Logfmt ixchamroq (hajmi 30–50% kam) va terminalda oson o'qiladi. JSON ichma-ich obyektlar va massivlarni qo'llab-quvvatlaydi, lekin qo'shtirnoqlarni ekranlashtirishni talab qiladi. Tanlov infratuzilmaga bog'liq: ELK uchun — JSON, konsol ko'rinishi uchun — logfmt.
Ilova ishga tushirilganda bitta UUID nusxasini yarating, uni singleton yoki DI konteynerida saqlang va konstruktor orqali barcha logger-larga o'tkazing. Muqobil — Kotlin korutinlarida threading-local yoki Continuation Local Storage dan foydalanish.
Mumkin, lekin tavsiya etilmaydi — aralashtirish avtomatik indekslash imkoniyatini yo'qotadi. Agar loglarning bir qismi matnli bo'lsa, ularni muntazam ifodalar bilan pars qilish kerak, bu qidiruvning unumdorligi va ishonchliligini pasaytiradi. Barcha loglarni tuzilgan formatga o'tkazish yaxshiroq.
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.