Structured Logging — mahiyyəti, data formatları və tətbiqlərdə iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-05-28 Oxuma vaxtı: 8 dəq

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 — düz mətn əvəzinə açar-dəyər formatında logların təqdimatı, avtomatik emal üçün uyğundur
  • JSON — strukturlaşdırılmış logların ən geniş yayılmış formatı, bütün müasir toplama və analiz sistemləri tərəfindən dəstəklənir
  • Logfmt — Heroku-dan kompakt format, insan oxuması və grep ilə pars etmə üçün əlverişlidir
  • ELK Stack — Elasticsearch, Logstash, Kibana — strukturlaşdırılmış logların saxlanması və vizuallaşdırılması üçün standart infrastruktur
  • Kontekst — sorğu identifikatoru, istifadəçi sessiyası, tətbiq versiyası — hər bir strukturlaşdırılmış mesajın məcburi sahələri

Structured Logging nədir

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.

Strukturlaşdırılmış log formatları

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.

FormatNümunəNə vaxt istifadə edilməli
JSON{"event":"login","user_id":42}ELK Stack, bulud toplayıcıları, mikroservislər
Logfmtevent=login user_id=42 duration_ms=150Konsol, tail, heroku logs
MessagePackJSON-un ikili ekvivalentiYüksək yüklü sistemlər, IoT

JSON — universal format

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 — kompakt format

Logfmt Heroku-da konsol görünməsi üçün hazırlanmışdır. JSON-dan daha kompaktdır, insan oxumasını qoruyur və cutawk 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.

Structured Logging mobil inkişafda nə üçün lazımdır

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.

Toplama və analiz alətləri

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.

swift
// 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
    }
}

Structured Logging ən yaxşı təcrübələri

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.

kotlin
// 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)
    }
}

Hansı sahələr məcburidir

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.

Swift və Kotlin-də strukturlaşdırılmış loglama nümunələri

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ə.

swift
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)")
    }
}

Structured vs Unstructured: yanaşmaların müqayisəsi

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.

MeyarMətn loglarıStrukturlaşdırılmış loglar
OxunaqlılıqKonsolda yüksəkOrta (pretty-print tələb edir)
AxtarışAlt sətir üzrə grepSahələr və dəyərlər üzrə sorğular
AqreqasiyaDəstəklənmirOrta, median, persentillər
İnteqrasiyaPars etmə tələb edirELK/Loki/Datadog-da yerli
Saxlama həcmiDaha az (metadatasız)Daha çox (sahələr + dəyərlər)

Tez-tez verilən suallar

Mobil loglama üçün hansı format daha yaxşıdır?

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.

Müştəri tərəfdə strukturlaşdırılmış formatda loglamaq lazımdırmı?

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 JSON-dan nə ilə fərqlənir?

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.

Bütün loglara correlation ID necə əlavə etməli?

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.

Strukturlaşdırılmış və mətn loglarını qarışdırmaq olarmı?

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ə

  • Structured Logging — mətn sətirlərindən fərqli olaraq avtomatik indeksasiya və sorğular üçün uyğun olan açar-dəyər cütlü log formatı
  • JSON və logfmt — əsas formatlar: JSON toplama sistemləri üçün universaldır, logfmt konsol baxışı və docker logları üçün kompaktdır
  • Correlation ID — hər bir strukturlaşdırılmış mesajın məcburi sahəsi, onsuz logları istifadəçi sessiyasında birləşdirmək mümkün deyil
  • ELK Stack və Grafana Loki — strukturlaşdırılmış logların saxlanması, indeksasiyası və vizuallaşdırılması üçün standart infrastruktur həlləri
  • Performans — structured logging ilə komandalar mətn üzrə grep əvəzinə sahələr üzrə sorğular sayəsində hadisələri 4 dəfə daha sürətli aşkarlayır
  • Tipləşdirmə — analitik sistemlərdə aqreqasiyalar (orta, median, persentillər) üçün rəqəmlər sətir yox, rəqəm kimi ötürülməlidir

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.

Layihəni müzakirə et

Həm də oxuyun