Sběr a analýza aplikačních logů: postupy

Sběr a analýza logů z aplikací: Postupy

Proč systematicky sbírat a analyzovat logy

Logy jsou nejdostupnějším zdrojem informací o chování aplikací a infrastruktury. Slouží k odhalování incidentů, problémů s výkonem, bezpečnostních událostí i k produktové analytice. Kvalitní logování vyžaduje promyšlené schéma, pipeline sběru, úložiště, dotazovací jazyk a governance (retenci, ochranu dat, náklady). Cílem je pozorovatelnost (observabilita): schopnost porozumět interním stavům systému na základě externích výstupů bez invazivního zásahu do jeho běhu.

Typy logů a jejich použití

  • Aplikační logy – události, chyby, obchodní doména (objednávka, platba), metriky v textové podobě.
  • Přístupové logy – HTTP reverzní proxy, API gateway, WAF; klíčové pro latence, stavové kódy a identitu volajícího.
  • Systémové a infrastrukturní logy – kernel, init/správci služeb, kontejnery, orchestrátory.
  • Bezpečnostní logy – autentizace, autorizace, auditní stopy, anomálie.
  • Databázové logy – pomalé dotazy, deadlocky, plánovače; vodítko pro optimalizaci.

Principy dobrého logování

  • Strukturované logy – JSON/NDJSON s jasným schématem namísto volného textu.
  • Stabilní schéma – evoluce prostřednictvím verzování; pole nemažte, raději je označte jako deprecated.
  • Kontext – trace_id, span_id, correlation_id, identita uživatele/tenanta, verze sestavení a prostředí.
  • Čitelnost vs. strojová zpracovatelnost – lidsky čitelná zpráva message + strukturovaná data pro dotazy.
  • Mezinárodní prostředí – časy ve formátu ISO 8601 v UTC; čitelné klíče v angličtině.

Úrovně závažnosti a kategorizace

  • TRACE – podrobná diagnostika (v produkci ji lze vypnout, případně vzorkovat).
  • DEBUG – informace pro vývojáře; lze ji vypnout podle služby.
  • INFO – běžné události („objednávka vytvořena“).
  • WARN – neblokující problémy, anomálie.
  • ERROR – selhání požadavku/operace.
  • FATAL – fatální chybový stav vyžadující restart/eskalaci.

Schéma strukturovaných logů

Doporučená minimální pole:

  • timestamp (UTC ISO 8601 s milisekundami), level, message, logger/service, env, version.
  • trace_id, span_id, correlation_id pro propojení s distribuovaným tracingem.
  • http.method, http.path, http.status_code, latency_ms, client.ip.
  • user.id/tenant.id/session.id s ohledem na GDPR/PII.

Využívejte standardizované konvence (např. pole pojmenovaná tečkovou notací), aby bylo možné logy snadno mapovat na indexy a pole pro dotazy.

Standardy a interoperabilita

  • OpenTelemetry (OTel) Logs – jednotná sémantika pro logy, metriky a trace včetně přenosu přes OTLP.
  • ECS (Elastic Common Schema) – standardizovaná pole (event.*, http.*, user.*, cloud.*), usnadňují sdílené dotazy a vizualizace.

Vytváření logů: knihovny, formát a výkon

  • Preferujte strukturovaný logger (Monolog s JSON procesorem, Serilog/Pino/Bunyan apod.) s asynchronním výstupem.
  • V kontejnerech zapisujte na stdout/stderr; vyhněte se rotaci logů uvnitř aplikace.
  • Minimalizujte alokace a serializaci; používejte šablony zpráv (parametrizované zprávy) a pole vyhodnocovaná až při použití.

Pipeline logování: sběr, přenos, zpracování

Typická topologie:

  1. Vytváření – aplikace zapisuje strukturovaný JSON na stdout.
  2. Agent/sidecar – Fluent Bit, Vector, Filebeat snímají logy (tail), přidávají metadata (host, pod, namespace) a odesílají je dál.
  3. Přenosová vrstva – přímé HTTP/gRPC do úložiště nebo přes buffer (např. Kafka/NATS) pro vyšší odolnost a škálovatelnost.
  4. Zpracování – obohacení (geoIP, uživatel, release), maskování PII, deduplikace, normalizace schématu.
  5. Úložiště a indexace – sloupcové úložiště časových řad, fulltextový index, objektové úložiště pro „teplá/studená“ data.

Ochrana dat: PII, maskování a redakce

  • Nikdy nezapisujte do logů tajné údaje (tokeny, hesla, API klíče). Zaveďte čištění požadavků/odpovědí pro citlivé hlavičky a těla zpráv.
  • PII (e-mail, telefon, adresa, IP) maskujte nebo hashujte (HMAC s rotovaným klíčem) podle účelu.
  • Udržujte klasifikaci dat a minimalizaci dat – zapisujte do logů jen to, co má diagnostickou hodnotu.

Vzorkování (sampling) a řízení objemu

  • Vzorkování na začátku (head-based sampling) – rozhodnutí v místě vytváření logu (levné, ale bez znalosti dopadu).
  • Vzorkování na konci (tail-based sampling) – rozhodnutí po vyhodnocení (např. upřednostnění chyb a odlehlých hodnot).
  • Dynamické vzorkování – adaptivně podle SLA, latence, místa incidentu či tenanta (spravedlivé rozdělení prostředků).

Odolnost pipeline a ztrátovost

  • Agenti s diskovou vyrovnávací pamětí (filesystem) pro případ výpadku sítě.
  • Backpressure – regulace rychlosti při zahlcení úložiště; u nekritických logů upřednostňujte režim „fail-open“ a u auditních stop „fail-closed“.
  • Idempotentní příjem dat a deduplikace pomocí event.id a časového okna pro opakované pokusy.

Úložiště a indexace: možnosti a kompromisy

  • Fulltext + invertovaný index – flexibilní dotazy, vyšší náklady na zápis a RAM (příklad: ELK, OpenSearch).
  • Časové řady – optimalizované pro časové rozsahy a agregace (např. Loki s indexem štítků + objektové úložiště pro obsah).
  • Datové jezero – dlouhodobá retence v objektovém úložišti (Parquet), nad ním SQL/Trino/BigQuery pro ad hoc analýzy.

Dotazovací jazyky a analytika

  • Lucene/KQL – fulltext, filtry, agregace (terms, date histogram), procesory pipeline.
  • LogQL – výběr podle štítků + regex/filtr řádků, funkce rate a count_over_time.
  • SQL nad logy – federované dotazy (externí tabulky, Parquet), spojení s metadaty (tenanti, release).

Propojení s tracingem a metrikami

Logy by měly obsahovat identifikátory trace/span pro přecházení mezi vrstvami observability. Umožní to přechod od chybného požadavku (trace) k podrobnému kontextu (log) a zpět. Z logů lze odvozovat „odvozené metriky“ (počet chyb za minutu, P95 latence) pro tvorbu upozornění.

Upozornění a detekce anomálií

  • Pravidla nad logy (počet ERROR v časovém okně, výskyt konkrétního kódu/hlášení) a prahové hodnoty podle zón (pro každou službu/tenant).
  • Seznamy sledovaných položek/IOC (bezpečnost) – detekce podezřelých IP, user-agentů, signatur útoků.
  • Statistické a ML metody – robustní základní hodnoty, zjišťování odchylek (nárůsty, změny vzorců hlášení).

Dashboardy a provozní pohledy

  • „Zlaté signály“ – chybovost, latence, propustnost, saturace; podrobnější pohled na službu, endpoint, tenanta.
  • Rozložení chyb podle příčiny (kód, výjimka, navazující služba).
  • Mapy toků požadavků (service map) s přechodem k logům při anomálii.

Auditní a forenzní logy

  • Neměnnost – úložiště WORM, podpisy, časová razítka.
  • Podrobná granularita: kdo, kdy, co, odkud a s jakým výsledkem.
  • Oddělená retence a přístupová práva od běžných provozních logů.

Retence, vrstvení a náklady

  • Krátkodobá retence v hot úložišti (dny) v indexu pro provozní účely; delší retence v warm/cold úložišti s nižšími náklady.
  • Automatické zásady životního cyklu (rollover, shrink, delete) a úlohy ILM.
  • Řízení kardinality – rozumný počet štítků/klíčů, omezení unikátních kombinací (např. user.id ukládat do pole, nikoli do štítku).

Zabezpečení přístupu a compliance

  • RBAC/ABAC – přístup podle role, týmu, tenanta; zabezpečení na úrovni řádků/polí pro citlivá pole.
  • Šifrování uložených dat i dat při přenosu; správa klíčů v KMS, jejich rotace.
  • Záznamy o přístupech a dotazech nad logy pro audit; jasná pravidla pro sdílení dat.

Testování kvality logů

  • Testy kontraktu schématu logů (existence povinných polí, typy, rozsahy).
  • End-to-end testy pipeline (syntetické události → agent → úložiště → dotaz → upozornění).
  • Ověřování maskování PII a nepřítomnosti tajných údajů (skener využívající regulární výrazy/entropii).

Procesy a governance

  • „Pokyny k logování“ v repozitáři; kontrola úrovní a obsahu zpráv při code review.
  • „Provozní příručky“ – jak reagovat na typické vzorce chyb a jak provést korelaci.
  • Vlastnictví dashboardů a upozornění (pohotovostní služba), pravidelná ladicí setkání zaměřená na snižování šumu.

Anti-patterny v logování

  • „Zasypávání logy“ – nadměrné množství DEBUG/TRACE v produkci bez vzorkování.
  • Prokládání víceřádkových výpisů zásobníku bez víceřádkového parseru (řešte je jako strukturovaná pole).
  • Zapisování PII/tajných údajů, přístupových tokenů a kompletních datových záznamů bez filtrování.
  • Chybějící korelační identifikátory a kontext; nemožnost propojit požadavky.

Praktický plán implementace

  1. Standard logů: JSON, UTC, povinná pole (čas, level, service, env, trace_id, message), mapování na ECS/OTel.
  2. Vytváření: knihovna loggeru s middlewarem, který přenáší trace_id z HTTP hlaviček (např. traceparent).
  3. Agent: DaemonSet (K8s) s Fluent Bit/Vector, parsování JSON, obohacení o metadata kubernetes.*, maskování PII.
  4. Přenos: OTLP/HTTP → zprostředkovatel zpráv (Kafka) s retencí 24–72 h; témata podle služby a úrovně.
  5. Zpracování: procesor streamů (Flink/KStreams) – obohacení, deduplikace, validace schématu, směrování do úložišť.
  6. Úložiště: hot index (7 dní) + cold objektové úložiště (90 dní) + dlouhodobé datové jezero (12 měsíců).
  7. Observabilita: dashboardy, upozornění na odvozené metriky, propojení s tracingem (zpětné odkazy).
  8. Governance: ILM, RBAC, audity, přehledy nákladů, pravidelné čištění a revize pravidel.

Ukázka strukturované události logu

Minimalistický příklad (NDJSON):

{ "timestamp":"2025-10-26T21:15:42.137Z", "level":"ERROR", "service":"checkout-api", "env":"prod", "version":"1.42.0", "trace_id":"f9f9a3f2e1a64ea2", "span_id":"9c1b7d0a3c1f4f8e", "correlation_id":"ord-8b2a4", "http":{"method":"POST","path":"/v1/orders","status_code":502,"latency_ms":842}, "user":{"id_hash":"caa1f8..."}, "error":{"type":"UpstreamError","message":"payments timeout","stack":"..."}, "message":"Order submission failed due to upstream timeout" }

Migrace z nestrukturovaných logů

  • Zaveďte duální zápis (původní i strukturované logy) a testujte dotazy nad oběma formáty.
  • Postupně přepisujte volání loggeru na šablony zpráv + pole; omezte parsování pomocí regulárních výrazů ve fázi příjmu dat.
  • Vytvořte kompatibilní schéma a mapování (aliasy) pro staré klíče.

Měření efektivity logování

  • Poměr signálu k šumu – poměr relevantních upozornění k jejich celkovému počtu.
  • MTTD/MTTR – doba od vzniku chyby do její detekce/obnovení provozu, před zavedením standardu a po něm.
  • Náklady na GB a na užitečný incident – řízení rozpočtu a dopad optimalizací (vzorkování, vrstvení).

Závěr: logy jako páteř observability

Systematické logování přináší prediktivní provoz, rychlou diagnostiku incidentů a lepší produktová rozhodnutí. Klíčové je strukturovat události, obohacovat je o korelační kontext, bezpečně a efektivně je přenášet a ukládat a vybudovat nad nimi analytiku, upozorňování a governance. Logy se tak stávají spolehlivou vrstvou, která propojuje metriky, tracing i bezpečnostní dohled do jednotného, auditovatelného a nákladově udržitelného ekosystému.