Zpět na domů

Strukturované logy JSON: průvodce pro vývojáře

Článek představuje praktický průvodce implementací efektivního logování v distribuovaných systémech. Jsou zde popsány strukturované logy ve formátu JSON, použití MDC-kontextu pro předávání business-identifikátorů, správné oddělení úrovní error a warning, a také jednotná schéma logování vstupních bodů (entrypoints).

Jak správně psát logy: kompletní průvodce pro vývojáře
Advertisement 728x90

Strukturované logy v JSON: praktický průvodce pro vývojáře

Logování je kriticky důležitá součást observability v moderních distribuovaných systémech. Na rozdíl od metrik a stop poskytují logy maximální flexibilitu pro analýzu událostí v aplikaci. Tento článek nabízí konkrétní vzory pro implementaci efektivního logování s využitím strukturovaného formátu JSON, MDC kontextu a jasného rozdělení úrovní chyb.

Proč jsou strukturované logy důležitější než prostý text

Tradiční prosté logy, vhodné pro čtení z konzole, vytvářejí významné problémy při automatickém zpracování. Jejich parsování vyžaduje složité regulární výrazy, extrakce konkrétních dat je obtížná a změna formátu se stává bolestivým procesem. V distribuovaných systémech, kde incidenty vyžadují rychlou analýzu dat z mnoha zdrojů, se tyto nedostatky stávají kritickými.

Strukturované logy ve formátu JSON řeší tyto problémy:

Google AdInline article slot
  • Zjednodušují vyhledávání a filtraci podle konkrétních polí
  • Umožňují částečné indexování v vyhledávacích systémech
  • Usnadňují automatickou extrakci dat po incidentech
  • Zjednodušují filtraci osobních údajů a přidávání metainformací

Příklad neefektivního prostého logu:

2025-03-15 10:16:01.795 INFO 12345 --- [nio-8080-exec-1] c.e.UserController : Uživatel uložen v databázi: User{id=123, [email protected], role=USER}

Příklad strukturovaného logu v JSON:

{
  "timestamp": "2025-03-22T10:15:30.123Z",
  "level": "ERROR",
  "service": "auth-service",
  "traceId": "1fd7a997-6517-4b63-9baa-4238f8012734",
  "entrypoint": "HTTP request POST /api/user/auth",
  "message": "Selhalo ověření uživatele",
  "user_id": "user-789",
  "error": {
    "type": "InvalidCredentials",
    "details": "Poskytnuté heslo se neshoduje"
  }
}

Mapped Diagnostic Context pro průchozí identifikaci

Mapped Diagnostic Context (MDC) v SLF4J řeší problém přenosu kontextových informací přes řetězec volání. Namísto explicitního předávání identifikátorů přes všechny metody umožňuje MDC asociovat data s aktuálním vláknem provádění.

Google AdInline article slot

Klíčové aspekty použití MDC:

  • Business identifikátory — user_id, order_id, transaction_id
  • Technický kontext — traceId, spanId pro trasování
  • Metainformace EP — typ entrypointu, číslo pokusu provedení
  • Automatické čištění — povinné vyčištění kontextu po dokončení zpracování

MDC je zvláště důležitý pro entrypointy, kde musí být business identifikátory dostupné od samého začátku zpracování požadavku, často extrahované z hlaviček před čtením payload.

Body vstupu (Entrypoints) a jejich logování

Entrypoint (EP) — abstrakce označující začátek provedení business logiky. V moderních aplikacích jsou běžné:

Google AdInline article slot
  • HTTP/REST servery
  • gRPC servery
  • Kafka consumers
  • Cron jobs a scheduled tasks
  • Message queue listeners

Každý EP by měl být logován podle jednotného schématu:

  • Vstupní parametry — metadata a payload požadavku
  • Kontext provedení — business identifikátory, technické parametry
  • Výstupní data — výsledek zpracování nebo chyba
  • Stav provedení — úspěch/neúspěch s ohledem na retry politiku

Rozdělení error a warning v distribuovaných systémech

V distribuovaných systémech jsou retry mechanismy standardním přístupem pro zajištění spolehlivosti. To přímo ovlivňuje strategii logování:

Warning úroveň se používá pro:

  • Chyby při mezilehlých pokusech provedení
  • Dočasné výpadky, které mohou být opraveny opakovaným pokusem
  • Situace, které nevyžadují okamžitou pozornost operátora

Error úroveň je rezervována pro:

  • Finální neúspěšné pokusy provedení
  • Kritické chyby, které činí další retry zbytečné
  • Situace vyžadující okamžitý zásah

Číslování pokusů by mělo být od většího k menšímu (2 → 1 → 0), kde 0 znamená poslední pokus. To umožňuje snadno filtrovat logy podle finálních chyb.

Praktická implementace přes interceptory

Moderní frameworky poskytují mechanismy interceptorů pro implementaci průchozí funkčnosti. Schéma logování EP přes interceptory:

  • Inicializace kontextu — nastavení traceId, spanId v MDC
  • Logování vstupu — zápis metadat a vstupních parametrů EP
  • Zpracování požadavku — provedení business logiky s automatickým logováním přes MDC
  • Logování výstupu — zápis výsledku nebo chyby
  • Vyčištění kontextu — odstranění všech dat z MDC

Klíčové komponenty pro implementaci:

  • Interceptor logování vstupu/výstupu pro každý typ EP
  • Integrace se systémem trasování (Jaeger, Zipkin)
  • Automatická extrakce business identifikátorů z hlaviček
  • Jednotný formát serializace logů v JSON

Povinná pole ve strukturovaných logách

Pro zajištění konzistence a pohodlí analýzy by všechny logy měly obsahovat:

  • Základní technická pole

- timestamp ve formátu ISO-8601

- úroveň logování (ERROR, WARN, INFO, DEBUG)

- název služby a její verze

- identifikátor instance aplikace

  • Kontext provedení

- traceId a spanId pro korelaci požadavků

- identifikátor požadavku (requestId)

- typ a název entrypointu

- číslo pokusu provedení (retry count)

  • Business kontext

- hlavní business identifikátory (user_id, order_id atd.)

- metadata požadavku (HTTP metoda, endpoint, consumer group)

- prostředí provedení (stage, region, cluster)

  • Data události

- čitelné zprávy pro člověka

- strukturovaná data události

- stacktrace chyb (pro ERROR úroveň)

- doba trvání provedení (pro EP logy)

Integrace s ekosystémem observability

Strukturované logy neexistují izolovaně — jsou součástí komplexního systému observability:

Korelace s metrikami:

  • Použití stejných identifikátorů v lozích a metrikách
  • Spojení logů chyb s metrikami error rate
  • Kontextualizace anomálií v metrikách přes logy

Integrace s trasováním:

  • Jednotné traceId/spanId v lozích a stopách
  • Doplnění stop detaily z logů
  • Použití logů pro debug konkrétních spanů

Automatizace zpracování:

  • Automatické upozornění na základě vzorů v lozích
  • Integrace se systémy incident managementu
  • Automatická extrakce dat pro obnovu

Co je důležité

  • Strukturované logy v JSON zajišťují strojově čitelný formát, který zjednodušuje automatické zpracování a analýzu dat.
  • MDC kontext řeší problém předávání business identifikátorů přes řetězec volání bez změny signatur metod.
  • Jasné rozdělení error/warning je nezbytné pro správnou funkci retry mechanismů a snížení šumu v monitorování.
  • Jednotné schéma logování EP zajišťuje konzistenci a zjednodušuje analýzu distribuovaných transakcí.
  • Povinná sada polí v každém logu garantuje možnost korelace událostí a efektivního vyhledávání.

— Editorial Team

Advertisement 728x90

Číst dál