Structured Logging egy olyan megközelítés a naplózásra, ahol minden üzenet kulcs-érték párokkal rendelkező, géppel olvasható formátumban van bemutatva, nem pedig strukturálatlan szövegként. A lapos sztringektől eltérően a strukturált naplók metaadatokat tartalmaznak: timestamp, szint, modul, kérésazonosító — és indexelhetők elemzőrendszerek által. A O'Reilly Effective Logging adatai szerint a strukturált formátumokra való áttérés órákról percekre csökkenti az incidens keresésének idejét a mezők szerinti szűrés lehetőségének köszönhetően. Ez a de facto szabvány a modern mobil és szerveroldali fejlesztésben: a JSON és a logfmt lehetővé teszi a naplók programokkal történő feldolgozását, nem szemmel.
Főbb pontok
Structured Logging egy naplózási módszer, ahol minden üzenet elnevezett mezőket tartalmaz típusos értékekkel. Egy olyan sztring helyett, mint User 42 logged in from device ABC, egy strukturált napló mezők halmazaként néz ki: user_id=42, event=login, device_id=ABC, timestamp=2026-07-04T10:30:00Z.
A strukturált naplók fő előnye a szöveges naplókkal szemben a programozott feldolgozás lehetősége. A szöveges naplók értelmezése reguláris kifejezéseket és feltételezéseket igényel a sztring formátumáról. A strukturált naplók veszteség nélkül értelmezhetők: minden mezőnek ismert típusa és neve van, ami lehetővé teszi olyan lekérdezések építését, mint keress meg minden engedélyezési hibát az elmúlt órában a 42-es felhasználó számára további feldolgozás nélkül.
A Honeycomb.io (2023) adatai szerint azok a csapatok, amelyek élesben használják a structured logging-ot, átlagosan 4-szer gyorsabban észlelik az incidenseket, mint azok, amelyek szöveges naplókra és grep-re támaszkodnak.
Structured Logging több szerializációs formátumot támogat. A formátum kiválasztása az infrastruktúrától függ: a JSON kényelmes az Elasticsearch-szel és a felhőrendszerekkel való integrációhoz, a logfmt — konzolos megtekintéshez tail és grep segítségével, a Protocol Buffers — nagy teljesítményű, sávszélesség-korlátozású rendszerekhez.
| Formátum | Példa | Mikor használjuk |
|---|---|---|
| JSON | {"event":"login","user_id":42} | ELK Stack, felhő gyűjtők, mikroszolgáltatások |
| Logfmt | event=login user_id=42 duration_ms=150 | Konzol, tail, heroku logs |
| MessagePack | A JSON bináris megfelelője | Nagyteljesítményű rendszerek, IoT |
JSON a legelterjedtebb formátum a strukturált naplók számára. Minden gyűjtőrendszer natív módon támogatja: Logstash, Fluentd, Amazon CloudWatch, Google Cloud Logging. A JSON naplók könnyen olvashatók ember által és bármely programozási nyelvvel értelmezhetők külön könyvtárak nélkül. A fő hátrány — redundancia: minden kulcs-érték pár idézőjeleket és kettőspontot igényel, ami 30–50%-kal növeli a tárolt adatok mennyiségét a logfmt-hez képest.
Logfmt a Herokuban fejlesztették ki konzolos láthatóság céljából. Kompaktabb, mint a JSON, megőrzi az emberi olvashatóságot és könnyen vágható a cut és awk segítségével. Példa: ts=2026-07-04T10:30:00Z level=error module=api status=500. A logfmt nem igényli a legtöbb karakter escape-elését és jól alkalmas stdout-naplózásra konténerekben.
A mobil alkalmazásokban a Structured Logging három kulcsfeladatot old meg: a összeomlások okainak megtalálását az eszközön történő reprodukálás nélkül, a felhasználói munkamenetek követését és a teljesítmény elemzését alkalmazásverziónként.
A szöveges naplók a mobileszközökön szinte használhatatlanok — a fejlesztő nem tud grep-elni a naplókon a felhasználó eszközén. A strukturált naplókat elküldik a felhőrendszerekbe (Firebase, Sentry, Datadog), és ott indexelik azokat. Lekérdezés építhető: mutasd az összes crash-t iOS 17.4-en, alkalmazásverzió 3.2, a checkouts modulban — és néhány másodperc alatt pontos kiválasztást kapunk.
A Sentry (2024) adatai szerint a structured breadcrumbs-t használó alkalmazások 60%-kal több kontextussal rendelkeznek minden crash-jelentésben, mint azok, amelyek csak a hibaszöveget naplózzák. Ez közvetlenül befolyásolja a hiba javításának sebességét.
ELK Stack — Elasticsearch, Logstash, Kibana — továbbra is a szabványos infrastruktúra a strukturált naplókkal való munkához. A Logstash JSON formátumban fogadja a naplókat, átalakítja és elküldi az Elasticsearch-be indexelésre, a Kibana vizuális interfészt biztosít a lekérdezésekhez és irányítópultokhoz.
A mobilalkalmazások számára népszerűek a felhőalapú megoldások: Firebase Crashlytics egyéni naplókkal, Sentry breadcrumbs-szel, Datadog APM-követéssel. Ezek közvetlenül a mobil SDK-ból fogadják a strukturált naplókat és nem igénylik saját backend telepítését. A Firebase ingyenes csomagot kínál crash-jelentésekhez, a Sentry elosztott nyomkövetést ad hozzá, a Datadog pedig integrálódik az APM-mel a kérések teljesítményének egyidejű nyomon követéséhez a kliensen és a szerveren.
Grafana Loki — alternatíva az Elasticsearch-hez, naplókra optimalizálva. A Loki alapértelmezés szerint nem indexeli az üzenetek tartalmát, hanem címkéket (labels) használ a szűréshez. Ez lényegesen olcsóbb tárolás szempontjából és gyorsabb a rögzített mezőkészletre vonatkozó lekérdezésekben.
// Structured logging Swift Logger segítségével JSON-ba
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
}
}
A strukturált naplózás első szabálya: minden üzenetnek tartalmaznia kell egy kérés- vagy munkamenet-azonosítót. Kontextus nélkül egyetlen napló használhatatlan — nem lehet megérteni, melyik felhasználóhoz vagy kéréshez tartozik. Adjon hozzá correlation ID-t a munkamenet elején, és továbbítsa azt az alkalmazás összes rétegén keresztül.
A második szabály: mezők típusozása. A numerikus mezőket (duration_ms, status_code, retry_count) számként kell továbbítani, nem sztringként. Az Elasticsearch és hasonló rendszerek a számokat és sztringeket különbözően indexelik: a számokra aggregációk alkalmazhatók (átlag, medián, percentilis), a sztringekre — teljes szöveges keresés. A hamis típusozás megszünteti az analitikus irányítópultok építésének lehetőségét.
A harmadik szabály: kerülje az egymásba ágyazott objektumokat. A 2 szintnél mélyebb egymásba ágyazású JSON naplókat nehéz szűrni és vizualizálni. A {"user": {"name": "Alice", "role": "admin"}} helyett használjon lapos kulcsokat: user_name=Alice user_role=admin.
// Structured logging Androidon Timber + logfmt segítségével
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)
}
}
Minden strukturált üzenet minimális mezőkészlete: timestamp ISO 8601 formátumban, level (debug/info/warn/error/fatal), logger (modul vagy osztály neve), message (az esemény ember által olvasható leírása). További: correlation_id, user_id (ha ismert), version (alkalmazásverzió), platform (iOS/Android), environment (dev/staging/prod).
Correlation ID nélkül a strukturált naplók szórt rekordok gyűjteményévé válnak, amelyeket nem lehet egyetlen felhasználói forgatókönyvbe kapcsolni. Generáljon UUID-t minden alkalmazásindításkor, és adja hozzá az összes munkamenet-naplóhoz. A gyakorlatban a correlation ID-t át kell adni az összes rétegen: az UI-eseményektől a hálózati kérésekig és a háttérfeladatokig — ellenkező esetben a naplók egy része kontextus nélkül marad, és nem vesz részt az analitikában. A végponthoz végpontig tartó nyomkövetésben egyetlen UUID lehetővé teszi a felhasználói út teljes képének összegyűjtését.
iOS-on a strukturált naplózás megvalósítható egy os_log körüli burkolóval, amely a mezőket logfmt formátumba szerializálja. Android-on — a Timber segítségével egy egyéni Tree-vel, amely az üzeneteket JSON vagy logfmt formátumba alakítja át, mielőtt elküldené a szerverre.
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)")
}
}
A strukturált és szöveges naplók közötti választás a projekt fázisától függ. A fejlesztés korai szakaszaiban a szöveges naplók egyszerűbbek és gyorsabbak — a fejlesztő közvetlenül írja az üzenetet további burkolók nélkül. De amint a projekt túllépi egy csapat vagy egy szerver határait, a strukturált naplók kötelezővé válnak.
| Kritérium | Szöveges naplók | Strukturált naplók |
|---|---|---|
| Olvashatóság | Magas konzolon | Közepes (pretty-print szükséges) |
| Keresés | grep részsztringen | Lekérdezések mezők és értékek szerint |
| Aggregáció | Nem támogatott | Átlag, medián, percentilisek |
| Integráció | Értelmezést igényel | Natív ELK/Loki/Datadog-ban |
| Tárolási mennyiség | Kisebb (metadata nélkül) | Nagyobb (mezők + értékek) |
Gyakran Ismételt Kérdések
A szerverre küldéshez használja a JSON-t — ezt natívan támogatja a Firebase Crashlytics, a Sentry és a Datadog. Helyi megtekintéshez az Xcode vagy Android Studio naplóiban használja a logfmt-et — kompaktabb és formázás nélkül olvasható.
Igen, a kliens oldali strukturált naplók lehetővé teszik a kontextus hozzáadását minden crash-jelentéshez: OS-verzió, hálózati állapot, a felhasználó utolsó műveletei. Strukturált breadcrumbs nélkül a crash-jelentés csak a hívási vermet tartalmazza a felhasználói forgatókönyv nélkül.
A logfmt kompaktabb (30–50%-kal kisebb terjedelem) és könnyebben olvasható a terminálban. A JSON támogatja az egymásba ágyazott objektumokat és tömböket, de az idézőjelek escape-elését igényli. A választás az infrastruktúrától függ: ELK-hez — JSON, konzolos megtekintéshez — logfmt.
Hozzon létre egy példányt UUID-ből az alkalmazás indításakor, mentse el egy singletonban vagy DI-tárolóban, és adja át az összes loggernek a konstruktoron keresztül. Alternatíva — threading-local vagy Continuation Local Storage használata Kotlin coroutine-okban.
Lehet, de nem ajánlott — a keverés elveszti az automatikus indexelés lehetőségét. Ha a naplók egy része szöveges, reguláris kifejezésekkel kell őket értelmezni, ami csökkenti a keresés teljesítményét és megbízhatóságát. Jobb az összes naplót strukturált formátumba átmigrálni.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is