Structured Logging — hər bir mesajın strukturlaşdırılmamış mətn əvəzinə açar-dəyər cütləri ilə maşın oxuna bilən formatda təqdim edildiyi log yazma yanaşmasıdır. Düz sətirlərdən fərqli olaraq, strukturlaşdırılmış loglar metadata ehtiva edir: timestamp, səviyyə, modul, sorğu identifikatoru — və analiz sistemləri tərəfindən indekslənə bilər. O'Reilly Effective Logging məlumatlarına görə, strukturlaşdırılmış formatlara keçid sahələr üzrə filtrləmə imkanı sayəsində hadisə axtarış vaxtını saatlardan dəqiqələrə endirir. Bu, müasir mobil və server inkişafında de-fakto standartdır: JSON və logfmt logları proqramlarla, gözlə yox, emal etməyə imkan verir.
Əsas məqamlar
Structured Logging — hər bir mesajın tipli dəyərlərlə adlandırılmış sahələr ehtiva etdiyi log yazma üsuludur. User 42 logged in from device ABC kimi sətir əvəzinə strukturlaşdırılmış log sahələr dəsti kimi görünür: user_id=42, event=login, device_id=ABC, timestamp=2026-07-04T10:30:00Z.
Strukturlaşdırılmış logların mətn loglarından əsas üstünlüyü proqram emalı imkanıdır. Mətn loglarının pars edilməsi müntəzəm ifadələr və sətir formatı haqqında fərziyyələr tələb edir. Strukturlaşdırılmış loglar itkisiz pars edilir: hər sahənin məlum tipi və adı var ki, bu da əlavə emal olmadan son bir saat ərzində istifadəçi 42 üçün bütün avtorizasiya xətalarını tap səviyyəsində sorğular qurmağa imkan verir.
Honeycomb.io (2023) məlumatlarına görə, istehsalda structured logging istifadə edən komandalar hadisələri mətn loglarına və grep-ə güvənən komandalarla müqayisədə orta hesabla 4 dəfə daha sürətli aşkarlayır.
Structured Logging bir neçə seriyalaşdırma formatını dəstəkləyir. Format seçimi infrastrukturdan asılıdır: JSON Elasticsearch və bulud sistemləri ilə inteqrasiya üçün əlverişlidir, logfmt — tail və grep ilə konsol baxışı üçün, Protocol Buffers — yüksək məhsuldar, ötürmə qabiliyyəti məhdud sistemlər üçün.
| Format | Nümunə | Nə vaxt istifadə edilməli |
|---|---|---|
| JSON | {"event":"login","user_id":42} | ELK Stack, bulud toplayıcıları, mikroservislər |
| Logfmt | event=login user_id=42 duration_ms=150 | Konsol, tail, heroku logs |
| MessagePack | JSON-un ikili ekvivalenti | Yüksək yüklü sistemlər, IoT |
JSON strukturlaşdırılmış loglar üçün ən geniş yayılmış formatdır. Bütün toplama sistemləri tərəfindən yerli olaraq dəstəklənir: Logstash, Fluentd, Amazon CloudWatch, Google Cloud Logging. JSON logları insan tərəfindən asan oxunur və əlavə kitabxanalar olmadan istənilən proqramlaşdırma dili ilə pars edilir. Əsas çatışmazlıq — artıqlıq: hər bir açar-dəyər cütü dırnaq işarələri və iki nöqtə tələb edir ki, bu da saxlanılan məlumatların həcmini logfmt-la müqayisədə 30–50% artırır.
Logfmt Heroku-da konsol görünməsi üçün hazırlanmışdır. JSON-dan daha kompaktdır, insan oxumasını qoruyur və cut və awk ilə asanlıqla kəsilir. Nümunə: ts=2026-07-04T10:30:00Z level=error module=api status=500. Logfmt əksər simvolların ekranlaşdırılmasını tələb etmir və konteynerlərdə stdout-loglama üçün yaxşı uyğundur.
Mobil tətbiqlərdə Structured Logging üç əsas vəzifəni həll edir: cihazda təkrar istehsal etmədən çökmə səbəblərini tapmaq, istifadəçi sessiyalarını izləmək və tətbiq versiyaları üzrə performansı analiz etmək.
Mobil cihazlarda mətn logları demək olar ki, faydasızdır — tərtibatçı istifadəçinin cihazında logları grep edə bilməz. Strukturlaşdırılmış loglar bulud sistemlərinə (Firebase, Sentry, Datadog) göndərilir və orada indekslənir. Sorğu qurmaq olar: iOS 17.4-də bütün crash-ləri göstər, tətbiq versiyası 3.2, checkouts modulunda — və bir neçə saniyə ərzində dəqiq seçim əldə etmək.
Sentry (2024) məlumatlarına görə, structured breadcrumbs istifadə edən tətbiqlər yalnız xəta mətnini loglayan tətbiqlərlə müqayisədə hər crash hesabatında 60% daha çox kontekstə malikdir. Bu, birbaşa səhvin düzəliş sürətinə təsir edir.
ELK Stack — Elasticsearch, Logstash, Kibana — strukturlaşdırılmış loglarla iş üçün standart infrastruktur olaraq qalır. Logstash logları JSON-da qəbul edir, çevirir və indeksasiya üçün Elasticsearch-ə göndərir, Kibana sorğular və dashboardlar üçün vizual interfeys təmin edir.
Mobil tətbiqlər üçün bulud həlləri populyardır: Firebase Crashlytics xüsusi loglarla, Sentry breadcrumbs ilə, Datadog APM izləmə ilə. Onlar strukturlaşdırılmış logları birbaşa mobil SDK-dan qəbul edir və öz backend-in yerləşdirilməsini tələb etmir. Firebase crash hesabatları üçün pulsuz paket təqdim edir, Sentry distributed tracing əlavə edir, Datadog isə eyni anda müştəri və serverdə sorğu performansını izləmək üçün APM ilə inteqrasiya olunur.
Grafana Loki — loglar üçün optimallaşdırılmış Elasticsearch alternatividir. Loki standart olaraq mesaj məzmununu indeksləmir, filtrləmə üçün etiketlərdən (labels) istifadə edir. Bu, saxlamada əhəmiyyətli dərəcədə ucuzdur və sabit sahələr dəsti üzrə sorğularda daha sürətlidir.
// Structured logging Swift Logger vasitəsilə 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
}
}
Strukturlaşdırılmış loglamanın birinci qaydası: hər bir mesaj sorğu və ya sessiya identifikatoru ehtiva etməlidir. Kontekst olmadan tək bir log faydasızdır — hansı istifadəçiyə və ya sorğuya aid olduğunu anlamaq mümkün deyil. Sessiyanın başlanğıcında correlation ID əlavə edin və onu tətbiqin bütün təbəqələrindən ötürün.
İkinci qayda: sahələrin tipləşdirilməsi. Rəqəm sahələri (duration_ms, status_code, retry_count) sətir kimi deyil, rəqəm kimi ötürülməlidir. Elasticsearch və oxşar sistemlər rəqəmləri və sətirləri fərqli indeksləşdirir: rəqəmlərə aqreqasiyalar (orta, median, persentil) tətbiq oluna bilər, sətirlərə — tam mətn axtarışı. Yanlış tipləşdirmə analitik dashboardlar qurmaq imkanını əlindən alır.
Üçüncü qayda: iç-içə obyektlərdən qaçın. 2 səviyyədən dərin iç-içə JSON loglarını filtrləmək və vizuallaşdırmaq çətindir. {"user": {"name": "Alice", "role": "admin"}} əvəzinə düz açarlardan istifadə edin: user_name=Alice user_role=admin.
// Structured logging Android-də Timber + logfmt vasitəsilə
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)
}
}
Hər bir strukturlaşdırılmış mesaj üçün minimal sahə dəsti: timestamp ISO 8601 formatında, level (debug/info/warn/error/fatal), logger (modul və ya sinif adı), message (hadisənin insan oxuna bilən təsviri). Əlavə olaraq: correlation_id, user_id (məlumdursa), version (tətbiq versiyası), platform (iOS/Android), environment (dev/staging/prod).
Correlation ID olmadan strukturlaşdırılmış loglar bir istifadəçi ssenarisində birləşdirilə bilməyən dağınıq qeydlər dəstinə çevrilir. Hər tətbiq işə salındıqda UUID yaradın və onu bütün sessiya loglarına əlavə edin. Praktikada correlation ID bütün təbəqələrdən ötürülməlidir: UI hadisələrindən şəbəkə sorğularına və fon tapşırıqlarına qədər — əks halda logların bir hissəsi kontekstsiz qalacaq və analitikada iştirak etməyəcək. Uçdan-uca izləmədə bir UUID istifadəçi yolunun tam şəklini toplamağa imkan verir.
iOS-da strukturlaşdırılmış loglama os_log üzərində sahələri logfmt formatına seriyalaşdıran sarğı vasitəsilə həyata keçirilə bilər. Android-də — serverə göndərməzdən əvvəl mesajları JSON və ya logfmt-ə çevirən xüsusi Tree ilə Timber vasitəsilə.
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)")
}
}
Strukturlaşdırılmış və mətn logları arasında seçim layihənin mərhələsindən asılıdır. İnkişafın ilkin mərhələlərində mətn logları daha sadə və sürətlidir — tərtibatçı mesajı birbaşa əlavə sarğılar olmadan yazır. Lakin layihə bir komanda və ya bir server hüdudlarından kənara çıxan kimi, strukturlaşdırılmış loglar məcburi olur.
| Meyar | Mətn logları | Strukturlaşdırılmış loglar |
|---|---|---|
| Oxunaqlılıq | Konsolda yüksək | Orta (pretty-print tələb edir) |
| Axtarış | Alt sətir üzrə grep | Sahələr və dəyərlər üzrə sorğular |
| Aqreqasiya | Dəstəklənmir | Orta, median, persentillər |
| İnteqrasiya | Pars etmə tələb edir | ELK/Loki/Datadog-da yerli |
| Saxlama həcmi | Daha az (metadatasız) | Daha çox (sahələr + dəyərlər) |
Tez-tez verilən suallar
Serverə göndərmək üçün JSON istifadə edin — o, Firebase Crashlytics, Sentry və Datadog tərəfindən yerli olaraq dəstəklənir. Xcode və ya Android Studio loglarında yerli baxış üçün logfmt istifadə edin — daha kompaktdır və formatlama olmadan oxunur.
Bəli, müştəri tərəfdə strukturlaşdırılmış loglar hər crash hesabatına kontekst əlavə etməyə imkan verir: OS versiyası, şəbəkə vəziyyəti, istifadəçinin son hərəkətləri. Strukturlaşdırılmış breadcrumbs olmadan crash hesabatı istifadəçi ssenarisi olmadan yalnız çağrı yığınını ehtiva edir.
Logfmt daha kompaktdır (həcmi 30–50% az) və terminalda oxumaq daha asandır. JSON iç-içə obyektləri və massivləri dəstəkləyir, lakin dırnaq işarələrinin ekranlaşdırılmasını tələb edir. Seçim infrastrukturdan asılıdır: ELK üçün — JSON, konsol baxışı üçün — logfmt.
Tətbiq işə salındıqda bir UUID nümunəsi yaradın, onu sinqlton və ya DI konteynerində saxlayın və konstruktor vasitəsilə bütün logger-lərə ötürün. Alternativ — Kotlin korutinlərində threading-local və ya Continuation Local Storage istifadə etməkdir.
Olar, lakin tövsiyə edilmir — qarışdırma avtomatik indeksasiya imkanını itirir. Əgər logların bir hissəsi mətndirsə, onları müntəzəm ifadələrlə pars etmək lazımdır ki, bu da axtarışın performansını və etibarlılığını azaldır. Bütün logları strukturlaşdırılmış formata keçirmək daha yaxşıdır.
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