AI do analizy logów: od zbierania danych po wykrywanie anomalii w systemach

0
16
3/5 - (1 vote)

Nawigacja:

Dlaczego logi to trudny, ale cenny materiał dla AI

Logi jako pamięć systemu: sygnał schowany w szumie

Logi są faktyczną, techniczną pamięcią systemu – zapisują każdy istotny krok działania aplikacji, systemu operacyjnego, urządzeń sieciowych czy usług chmurowych. Dla AI oznacza to ogromne źródło danych o tym, jak system zachowuje się w warunkach normalnych oraz co dzieje się, gdy zaczyna się coś psuć. Problem w tym, że ten sygnał jest mocno zaszumiony: zdecydowana większość wpisów logów opisuje w pełni poprawne, rutynowe zdarzenia.

Strumień logów bywa ekstremalnie powtarzalny – ten sam komunikat error lub info może pojawić się tysiące razy w ciągu godziny. Modele AI dostają więc do analizy dane, w których anomalia to pojedynczy procent lub promil wszystkich wpisów. To zła wiadomość z perspektywy uczenia modeli, szczególnie nadzorowanych, ale jednocześnie ogromna szansa dla metod nienadzorowanych i sekwencyjnych, które skupiają się na „typowości” i odchyleniach od niej.

Do tego dochodzi bardzo zróżnicowany poziom jakości: od dobrze zdefiniowanych, strukturalnych logów JSON, po chaotyczne „zlepki” tekstu generowane przez stare komponenty, bez spójnego formatu i z minimalnym kontekstem. AI musi sobie z tym poradzić, a to oznacza konieczność poważnego przygotowania danych, zanim jakikolwiek model zacznie mieć sens.

Różne typy logów i wpływ na podejście do AI

Logi systemowe, aplikacyjne, sieciowe i bezpieczeństwa różnią się nie tylko treścią, ale także strukturą, częstotliwością i poziomem krytyczności. To przekłada się na wybór metod analitycznych i modeli AI.

  • Logi systemowe (OS, kernel, usługi) – często pół-strukturalne, stosunkowo przewidywalne, mocno zależne od wersji systemu. Dobre pole do klasycznych metod parsowania i normalizacji.
  • Logi aplikacyjne – zwykle najbardziej różnorodne i „twórcze”. Każdy zespół pisze logowanie po swojemu, stosuje inne formaty i poziomy szczegółowości. AI musi być odporne na zmiany wersji aplikacji i brak standardu.
  • Logi sieciowe – często strukturalne (np. NetFlow, firewall), o wysokim wolumenie. Nadają się do analizy ilościowej, statystycznej i modelowania przepływów. Anomalie to najczęściej nagłe skoki, zmiany kierunków ruchu, nieoczekiwane protokoły.
  • Logi bezpieczeństwa (IDS/IPS, WAF, AV, EDR, SIEM) – często już częściowo obrobione i zaklasyfikowane, co jest plusem, ale zawierają też dużo regułowych false positive. AI często służy tutaj do priorytetyzacji alarmów i redukcji szumu.

To, z jakim typem logów się pracuje, ma duży wpływ na dobór pipeline’u analizy, sposobu tokenizacji, a nawet na to, czy ma sens stosowanie zaawansowanych modeli sekwencyjnych, czy wystarczą prostsze metody oparte na agregatach i regułach.

Główne cele wykorzystania AI w analizie logów

Modele AI przy logach zwykle nie są celem samym w sobie. Mają wspierać istniejące procesy operacyjne i bezpieczeństwa. Najczęstsze, realne zastosowania to:

  • Detekcja anomalii – wykrywanie nietypowych wzorców zdarzeń, błędów, skoków ilości logów, nowych typów komunikatów czy rzadkich sekwencji zachowań.
  • Przewidywanie incydentów – szukanie sygnałów ostrzegawczych przed awarią lub atakiem, np. stopniowo rosnące czasy odpowiedzi, falujące błędy w określonych modułach, powtarzalne sekwencje poprzedzające crash.
  • Root cause analysis – wspieranie inżynierów SRE/DevOps/SOC w szybkim znajdowaniu źródła problemu dzięki korelacji logów z wielu systemów i automatycznej analizie zależności.
  • Priorytetyzacja i triage – automatyczne grupowanie i ocenianie ważności alertów, tak aby ludzie skupiali się na tych, które naprawdę są krytyczne.

AI nie zastąpi tradycyjnych metryk monitoringu czy prostych alertów progowych; raczej je uzupełnia. Dobrze skonfigurowany alert CPU > 95% przez X minut nadal jest szybki i skuteczny. AI ma przewagę głównie tam, gdzie reguł jest za dużo, są zbyt skomplikowane lub nie da się ich ująć w prostą logikę.

Klasyczne reguły vs AI – kiedy co ma sens

Stare dobre podejście: SIEM, reguły korelacji, alerty progowe. Sprawdza się wszędzie tam, gdzie:

  • da się dokładnie opisać warunek, który ma wywołać alert (np. 5 nieudanych logowań w 1 minutę z tego samego IP),
  • zmiany w systemie są stosunkowo rzadkie,
  • nie ma ekstremalnej zmienności sezonowej i kontekstowej.

AI ma sens dopiero wtedy, gdy natężenie logów i złożoność korelacji przekraczają możliwości utrzymania ręcznie tworzonych reguł. Przykłady:

  • kilkadziesiąt źródeł logów, kilkanaście mikroserwisów, częste deploye i zmiany wzorców ruchu – reguły dezaktualizują się zbyt szybko,
  • złożone ataki, w których pojedyncze zdarzenia są niewinne, a anomalia wynika z sekwencji i czasu występowania,
  • konieczność wykrywania „nowych typów problemów”, których jeszcze nikt nie opisał w regułach.
  • Jeżeli większość incydentów i tak jest dobrze pokryta przez prosty monitoring, inwestycja w duży projekt AI do logów może się nie zwrócić. Często lepsze efekty przynosi dołożenie kilku prostych algorytmów nienadzorowanych i lepsza higiena logowania, niż od razu pełnoskalowy system oparty o złożone modele sekwencyjne.

    Serwer w centrum danych z plątaniną kabli i centralnym modułem dostępu
    Źródło: Pexels | Autor: Brett Sayles

    Od zbierania do uporządkowania: fundamenty pracy z logami

    Źródła logów i ryzyko „ślepych plam”

    Bez kompletnego obrazu systemu nawet najlepszy model AI będzie się mylił. Typowy ekosystem logów obejmuje:

  • serwery fizyczne i wirtualne (system, usługi, agent monitoringu),
  • kontenery i orkiestrację (Docker, Kubernetes, logi podów, kubelet, control plane),
  • aplikacje webowe, backendy, worker services, batch jobs,
  • urządzenia sieciowe (routery, switche, load balancery, firewalle),
  • usługi chmurowe (CloudTrail, CloudWatch, Stackdriver, Azure Monitor),
  • usługi SaaS (np. narzędzia CI/CD, CRM, narzędzia bezpieczeństwa).

Ślepą plamą staje się każdy system, z którego logi nie są zbierane lub nie są zsynchronizowane czasowo. Przykład z praktyki: AI wykrywa anomalię w aplikacji, ale nie widzi, że w dokładnie tym samym czasie firewall odrzuca specyficzny rodzaj ruchu – bo logi z firewalla nie są centralizowane. W efekcie model traktuje normalne zachowanie jako coś podejrzanego.

Przy planowaniu AI do logów lepiej zacząć od audytu źródeł: co loguje, jak, gdzie, w jakim formacie, jaki jest wolumen, jaki poziom krytyczności. Dopiero z takiego inwentarza da się sensownie budować pipeline analizy logów.

Strukturalne, pół-strukturalne i nieustrukturyzowane logi

Format logów wprost wpływa na to, jak trudne będzie ich późniejsze parsowanie i jak stabilne będą funkcje wejściowe do modeli. Najczęściej spotykane typy:

  • Logi strukturalne – np. JSON, Protobuf, CSV z jasno zdefiniowanymi polami: timestamp, level, service, code, message, user_id. Ułatwiają normalizację i analizę, świetnie nadają się pod AI.
  • Logi pół-strukturalne – np. syslog, „formaty” ze stałymi prefiksami, ale niejednolitą treścią komunikatu. Często wymagają regexów i wzorców parsujących.
  • Logi nieustrukturyzowane – dowolny tekst wyrzucany przez aplikację, bez spójnego formatu. Można je poddać analizie NLP lub próbować „wydobyć” strukturę metodami log parsing (Drain, Spell, IPLoM), ale jest to bardziej kruche.

O ile to możliwe, warto wymuszać strukturalne logi na poziomie implementacji aplikacji – AI dostanie wtedy stabilne, powtarzalne cechy. Parsowanie pół-strukturalnych formatów daje się zautomatyzować, ale każdy większy refactor logowania może zniszczyć wzorce. W logach nieustrukturyzowanych modele tekstowe bywają skuteczne, ale rośnie koszt obliczeniowy i maleje przewidywalność działania.

Centralizacja logów: narzędzia i kompromisy

Bez centralnego miejsca gromadzenia logów nierealne jest budowanie spójnych modeli AI. Najpopularniejsze platformy to:

  • ELK / OpenSearch – elastyczne, szeroko stosowane, z dużą ilością integracji. Dobrze sprawdzają się jako baza pod dalsze przetwarzanie, ale przy bardzo dużym wolumenie koszty klastra mogą szybko rosnąć.
  • Loki – zoptymalizowany pod logi tekstowe, efektywny kosztowo przy dużej ilości danych, szczególnie w środowiskach Kubernetes. Mniej natywnych funkcji analitycznych niż pełny Elasticsearch.
  • Splunk – potężna platforma komercyjna z własnymi modułami AI/ML, ale kosztowna i wymagająca specjalistycznej wiedzy.
  • Systemy chmurowe – CloudWatch, Stackdriver, Azure Monitor, Log Analytics. Dobrze integrowane z własnym ekosystemem usług, oferujące bazowe detekcje i integracje z AI, jednak często zamknięte w danej chmurze i trudniejsze do użycia w scenariuszach multi-cloud.

Centralizacja to nie tylko wygoda – to warunek, aby móc korelować zdarzenia i trenować modele na spójnym obrazie ruchu i błędów w całym środowisku. Jednocześnie trzeba pilnować kosztów transferu i przechowywania oraz wydajności zapytań, bo pipeline analizy logów dla AI generuje dodatkowe obciążenie.

Podstawowy pipeline analizy logów: od agenta do retencji

Typowy pipeline analizy logów, który ma zostać wzbogacony o AI, obejmuje kilka kroków:

  • Zbieranie – agent na hostach (np. Filebeat, Fluent Bit), sidecar w podach Kubernetes, integracje z API SaaS. Celem jest niezawodne dostarczenie logów w możliwie jednolitym formacie.
  • Transport – kolejki i strumienie (Kafka, MQTT, Kinesis) lub bezpośrednie push/pull do centralnego systemu. Dla AI istotne są metadane o źródle oraz kolejność zdarzeń.
  • Składowanie i indeksacja – bazy time-series, indeksy w Elasticsearch/OpenSearch, obiekty w S3/Blob jako tańsze archiwum. Tu zapadają decyzje o retencji i rozdzieleniu warstwy „online” od „archiwum” dla trenowania modeli.
  • Udostępnienie do analizy – API, eksporty batchowe (np. do Data Lake), integracje z narzędziami AI (Spark, Databricks, systemy MLOps).

Jeżeli AI ma pracować blisko czasu rzeczywistego, pipeline musi być w stanie przetwarzać logi strumieniowo i dostarczać cechy do modelu z minimalnym opóźnieniem. To w praktyce oznacza przemyślany wybór narzędzi, klarowną strukturę eventów i monitoring przepływu logów, bo każda „dziura” lub spowolnienie wpływa na jakość detekcji anomalii.

Prawo, prywatność i koszty – ograniczenia nie tylko techniczne

Logi potrafią zawierać dane osobowe lub informacje sensytywne (IP powiązane z użytkownikiem, identyfikatory sesji, dane z nagłówków HTTP, a czasem nawet fragmenty payloadu). W kontekście RODO i przepisów branżowych trzeba:

  • zidentyfikować, które pola mogą być danymi osobowymi lub wrażliwymi,
  • ustalić reguły maskowania, pseudonimizacji lub anonimizacji na etapie zbierania,
  • ograniczyć dostęp do pełnych logów tylko do wąskich grup (SOC, SRE), a do modeli przekazywać pola już zanonimizowane.

Drugą warstwą jest koszt. Przechowywanie pełnych logów przez rok czy dłużej w szybkim storage potrafi wielokrotnie przekroczyć budżet samego projektu AI. Rozsądnym kompromisem jest:

  • krótka retencja w systemie „hot” (np. 7–30 dni),
  • agregacja i kompresja logów do archiwum na tańszym storage,
  • osobne, wyselekcjonowane zestawy danych treningowych, tworzone okresowo z archiwum.

Dobre praktyki retencji logów wymagają pogodzenia potrzeb bezpieczeństwa (długa historia incydentów), SRE (debugowanie po czasie), compliance (określone przez prawo minimalne retencje) oraz kosztów operacyjnych. AI nie jest tu wyjątkiem – działa w tych samych ograniczeniach.

Przygotowanie logów do analizy AI: czyszczenie, parsowanie, normalizacja

Dlaczego surowe logi rzadko nadają się do modelowania

Logi w formie surowej to zwykle mieszanka różnych formatów, poziomów, źródeł i języków. Nawet jeśli wszystkie trafiają do jednego systemu, to:

  • pola są nazywane inaczej przez różne zespoły (np. user, user_id, uid, client),
  • czas bywa zapisywany w różnych strefach, z lub bez milisekund,
  • Niespójności, duplikaty, brakujące dane

    Przy większej liczbie źródeł logów pojawiają się trzy powtarzalne problemy: niespójność pól, duplikaty oraz luki. Każdy z nich potrafi wywrócić model do góry nogami, jeżeli zostanie zignorowany.

  • Niespójność pól – ten sam koncept biznesowy opisany innymi polami albo w innej skali (np. duration_ms vs latency_seconds, status HTTP jako liczba vs string). Modele dostają sygnały rozmyte lub sprzeczne.
  • Duplikaty – te same eventy dostarczane kilkoma ścieżkami (np. agent + logi aplikacji + audyt bazy). Bez deduplikacji można „nauczyć” model, że normalne zdarzenie jest ekstremalnie częste, przez co anomalie przestają wystawać ponad tło.
  • Braki i luki – okresy, w których logi z danego źródła nie docierają (restart agenta, pełny dysk, błąd integracji). W modelu sekwencyjnym taki „znikający” strumień może wyglądać jak anomalia – albo, przeciwnie, ukrywać prawdziwe problemy.

Na etapie przygotowania danych bardziej opłaca się poświęcić czas na jawne modelowanie tych zjawisk (flagi typu missing_source, retry_count, duplicate_flag) niż liczyć, że model sam „jakoś” się zorientuje.

Normalizacja pól czasowych i stref

Czas jest kręgosłupem większości analiz anomalii na logach. Bez sensownego, spójnego czasu trudno mówić o korelacjach między serwisami. Podstawowe decyzje:

  • jedna strefa czasowa dla całego systemu logów (zwykle UTC),
  • jawne przechowywanie oryginalnej strefy i offsetu, jeżeli ma znaczenie biznesowe (np. logi z oddziałów w różnych krajach),
  • wymuszenie jednego formatu timestampu (np. RFC3339 z milisekundami).

Modele sekwencyjne (RNN, Transformer) i algorytmy nienadzorowane (np. Isolation Forest na cechach z okien czasowych) działają zdecydowanie stabilniej, gdy odstępy czasowe i porządki są spójne. Częstym błędem jest mieszanie logów z różnych systemów, w których zegary są rozjechane – model wówczas „widzi” zdarzenia w złej kolejności, co psuje kontekst.

Mapowanie poziomów logowania i typów zdarzeń

Poziomy logowania (DEBUG, INFO, WARN, ERROR) i typy eventów (np. authentication_failed, payment_authorized) są dla modeli bardzo użytecznymi cechami, o ile występują konsekwentnie. Typowe działania porządkujące:

  • mapowanie różnych konwencji poziomów na wspólny schemat (np. lokalne TRACEDEBUG, CRITERROR),
  • wydzielenie pola event_type na podstawie kodów błędów, patternów w wiadomości lub tagów aplikacyjnych,
  • unikanie wrzucania całego znaczenia loga w „poziom” – jeśli wszystkie problemy są ERROR, model niewiele się nauczy z rozróżnienia poziomów.

W praktyce lepsze efekty daje ograniczenie liczby unikalnych typów zdarzeń do sensownego minimum niż tworzenie tysięcy pseudo-unikalnych nazw, których i tak nikt nie rozumie.

Parsowanie treści logów: wzorce, heurystyki i granice automatyzacji

Większość logów ma jakąś ukrytą strukturę, nawet jeśli na pierwszy rzut oka wydaje się chaotyczna. Istnieją trzy główne podejścia do parsowania:

  • Reguły i regexy – dobre do prostych, stabilnych formatów (Nginx, Apache, klasyczne syslogi). Szybkie i tanie, ale kruche przy zmianach.
  • Parsery oparte na wzorcach – narzędzia typu Grok, kombinacje tokenów i predefiniowanych schematów, które można składać w bardziej złożone reguły.
  • Log parsing z użyciem ML – algorytmy jak Drain, Spell, IPLoM wyodrębniają szablony logów i zmienne parametry („Failed login for user <X> from IP <Y>”). Dobre przy heterogenicznych logach, ale wymagają walidacji i strojenia.

Granica automatyzacji jest zwykle tam, gdzie logi są źle zaprojektowane: brak powtarzalnych patternów, mieszanie kilku języków, teksty pisane „po ludzku” zamiast maszynowo. W takich miejscach lepiej rozważyć zmianę sposobu logowania niż próbować „ratować” sytuację modelami NLP.

Ekstrakcja parametrów i kodów błędów

Z punktu widzenia AI dużo ważniejsze od surowej treści komunikatu są parametry, które się w niej kryją. W praktyce chodzi o:

  • wydobycie kodów błędów, identyfikatorów requestów, numerów portów,
  • wyciągnięcie metryk typu duration, size, count, nawet jeśli są wplecione w tekst,
  • standaryzację nazw tych parametrów (np. wszędzie request_id, a nie na przemian rid, req, trace_id).

Przykładowo: log „Query took 253 ms and returned 0 rows” można sprowadzić do struktury: {event_type: db_query, duration_ms: 253, rows: 0}. Dla modelu anomalii to bez porównania bardziej użyteczna reprezentacja niż cały tekst w jednym polu.

Normalizacja wartości i kategoryzacja rzadkich encji

Wielu pól z logów nie da się sensownie wykorzystać wprost, bo mają ogromną kardynalność (np. pełne URL z parametrami, identyfikatory sesji, unikalne joby w systemie batchowym). Typowe techniki to:

  • hashowanie – sprowadzanie długich stringów do krótkich hashy, redukuje rozmiar reprezentacji, ale utrudnia interpretację,
  • kategoryzacja – grupowanie wartości w kilka klas (np. /api/v1/orders/* zamiast pełnego URL),
  • próg rzadkości – wszystko, co pojawia się poniżej określonej liczby razy, trafia do kategorii OTHER lub RARE.

Modele nienadzorowane są szczególnie wrażliwe na „szum kategorii” – duża liczba bardzo rzadkich wartości powoduje, że wszystko zaczyna wyglądać jak anomalia. Ograniczenie liczby możliwych wartości na wejściu zwykle stabilizuje wyniki.

Usuwanie danych wrażliwych i pseudonimizacja

Maskowanie danych wrażliwych jest nie tylko wymogiem prawnym, ale również elementem higieny danych treningowych. Najczęstsze techniki:

  • hashowanie deterministyczne – np. e-mail → hash, który zawsze jest taki sam dla tej samej wartości; pozwala śledzić zachowanie tego samego użytkownika bez znajomości jego danych,
  • maskowanie częściowe – pozostawienie fragmentu danych (np. ostatnich cyfr numeru karty) tylko tam, gdzie jest to konieczne do analizy,
  • redakcja pełna – całkowite usuwanie pól, które nie są potrzebne do celu analizy (np. pełne payloady requestów w systemach finansowych).

Jeżeli planowane są eksperymenty z modelami generatywnymi (LLM) na logach, próg ostrożności trzeba ustawić wyżej. Modele tego typu są bardziej podatne na „wycieki” informacji z danych treningowych niż klasyczne algorytmy predykcyjne.

Zbliżenie na szafę serwerową z podświetlonymi dyskami danych
Źródło: Pexels | Autor: panumas nikhomkhai

Reprezentacja logów pod kątem AI: od tokenizacji do wektorów

Poziomy reprezentacji: event, sekwencja, sesja

Logi można reprezentować na kilku poziomach, w zależności od pytania, jakie się stawia modelowi:

  • Event – pojedynczy wpis logu jako jedna próbka. Dobre do klasyfikacji typu „czy ten log jest podejrzany?”.
  • Sekwencja – uporządkowany ciąg logów (np. z jednego hosta, usługi, użytkownika). Używane przy detekcji anomalii sekwencyjnych i analizie „ścieżki” problemu.
  • Sesja / transakcja – zgrupowanie logów należących do jednego requestu, sesji użytkownika, zadania w systemie batchowym. Przydaje się tam, gdzie liczy się kontekst end-to-end.

Ta decyzja ustala później wszystko: jakich cech użyć, jak zbudować okna czasowe, jakie modele mają sens (LSTM, Transformer, czy proste algorytmy tablicowe). Błędem jest wrzucanie wszystkiego do jednego worka „event” i oczekiwanie, że model sam „złoży” kontekst.

Cechy liczbowo-kategoryczne vs tekstowe

W większości systemów logów więcej wartości wnosi dobrze przygotowana warstwa cech liczbowych i kategorycznych niż surowy tekst. Podstawowe grupy cech:

  • Liczbowe – czasy odpowiedzi, rozmiary payloadów, liczba błędów w oknie, liczba prób logowania, CPU/RAM w momencie zdarzenia.
  • Kategoryczne – typ usługi, region, poziom logowania, typ błędu, metoda HTTP, klasa endpointu.
  • Tekstowe – treść wiadomości, stack trace, fragment zapytania SQL.

Modele dobrze radzą sobie z liczbami i kategoriami, o ile zastosuje się odpowiednie kodowanie (one-hot, target encoding, embeddingi). Tekst powinien być używany tam, gdzie rzeczywiście przenosi informację, której nie da się prosto zredukować do struktur (np. rzadkie komunikaty błędów w zewnętrznych bibliotekach).

Kodowanie kategorii: od one-hot do embeddingów

Kluczowe kategorie z logów (np. typ eventu, usługa, endpoint) trzeba zamienić na wektory. Główne techniki:

  • One-hot encoding – proste, ale szybko eksploduje wymiarem przy dużej liczbie kategorii. Sprawdza się przy kilku–kilkunastu wartościach.
  • Ordinal encoding – zamiana kategorii na liczby całkowite. Użyteczne do indeksowania, ale modele liniowe mogą błędnie wnioskować o „porządku” tych wartości.
  • Embeddingi – wektorowa reprezentacja kategorii uczona razem z modelem (lub osobno). Dobrze działa przy dziesiątkach/setkach kategorii, szczególnie w modelach sekwencyjnych.

Przykład praktyczny: endpointy API można zakodować jako embeddingi i użyć w modelu LSTM analizującym sekwencje wywołań. Model uczy się, że pewne ciągi endpointów są typowe, a inne – rzadkie lub charakterystyczne dla incydentów.

Reprezentacja tekstu: tokenizacja, bag-of-words, embeddingi kontekstowe

Jeżeli tekst logu jest istotny, wybór sposobu jego reprezentacji ma duży wpływ na koszty i wyniki. Popularne opcje:

  • Bag-of-words / TF-IDF – dobre do klasyfikacji statycznych komunikatów (np. rozpoznawanie typu błędu po treści). Tańsze obliczeniowo, ale tracą kolejność słów.
  • Tokenizacja subword (BPE, WordPiece) – używana w nowoczesnych modelach NLP. Pozwala radzić sobie z rzadkimi słowami i wariantami tej samej frazy.
  • Embeddingi kontekstowe (BERT, GPT, Sentence Transformers) – generują gęste wektory odzwierciedlające znaczenie całej wiadomości. Dobre do wyszukiwania podobnych logów, klastrowania, detekcji anomalii tekstowych.

Modele generatywne na logach są kuszące, ale trzeba pilnować budżetu: embedding każdego logu osobnym zapytaniem do dużego modelu potrafi być nieopłacalny przy milionach eventów dziennie. Rozsądniejszym podejściem bywa ograniczenie się do logów już wstępnie wyselekcjonowanych prostszymi regułami.

Okna czasowe i agregaty sekwencyjne

Sama reprezentacja pojedynczego eventu to zwykle za mało, aby wykryć anomalię w zachowaniu systemu. Potrzebne są cechy agregujące w czasie, np.:

  • liczba requestów / błędów / timeoutów w ostatnich N sekundach lub minutach,
  • procentowy udział danego typu błędu w oknie,
  • średnie i percentyle czasu odpowiedzi w oknie (p50, p90, p99),
  • liczba unikalnych użytkowników, IP, endpointów.

Takie cechy są bazą dla wielu algorytmów anomalii, od prostych progów po modele probabilistyczne. Ich sensowność zależy od dobranego okna: inne parametry mają sens dla serwisu obsługującego tysiące requestów na sekundę, a inne dla nocnego batcha uruchamianego raz na godzinę.

Szablony logów (log templates) jako cechy

Algorytmy log parsing generują szablony typu „Connection from <IP> timed out after <N> ms” z parametrami IP i N. Id szablonu można potraktować jako kategorię i zakodować go embeddingiem lub one-hotem.

Połączenie: id_szablonu + parametry numeryczne tworzy bardzo silną reprezentację. Model „uczy się”, że np. szablon „Failed login for user <U>” jest normalny do pewnego progu na godzinę, ale powyżej niego – sygnalizuje atak. Jednocześnie ten sam parametr user może być dalej hashowany/pseudonimizowany, więc nie trzeba przechowywać jawnych danych.

Reprezentacja graficzna zależności między usługami

Modelowanie topologii systemu jako grafu

Dla wielu scenariuszy pojedynczy event lub nawet sekwencja z jednego hosta to za mało. W systemach rozproszonych problemy „rozlewają się” po kilku usługach, kolejkach, bazach danych. Dobrym przybliżeniem rzeczywistości jest wtedy graf:

  • wierzchołki – usługi, bazy, kolejki, load balancery,
  • krawędzie – wywołania synchroniczne (HTTP, gRPC) i asynchroniczne (MQ, Kafka),
  • atrybuty – przepływ QPS, latency, error rate, rozkład kodów odpowiedzi, a nawet embeddingi typowych szablonów logów na danej krawędzi.

Taki graf można utrzymywać dynamicznie, na podstawie telemetryki i metadanych z logów (np. service="checkout", upstream_service="payments"). W praktyce i tak istnieje jakiś „service map” w APM – chodzi o to, aby go zmaterializować w formie, z którą poradzą sobie modele grafowe.

Uczenie na grafach usług (GNN, PageRank, centralność)

Mając graf, można przejść z poziomu „dziwne logi w usłudze X” do „nienaturalny przepływ zachowań między usługami”. Przykładowe podejścia:

  • Graph Neural Networks (GNN) – każdy węzeł ma wektor cech, np. zagregowane metryki z logów; model uczy się reprezentacji węzłów, które uwzględniają kontekst sąsiedztwa. Odchylenie wektora w czasie może wskazywać anomalię w konkretnym fragmencie topologii.
  • Miary centralności (degree, betweenness) – gwałtowne zmiany „ważności” węzła w krótkim czasie bywają sygnałem przepięcia ruchu, awarii w innym komponencie albo nieoczekiwanych ścieżek wywołań.
  • Analiza ścieżek – porównywanie rozkładu typowych ścieżek requestów (trace’y) z aktualnym rozkładem. Gdy nagle rośnie liczba rzadko spotykanych ścieżek, zwykle jest ku temu powód.

Modele grafowe same w sobie nie „naprawią” jakości logów. Jeżeli korelacja między eventami a zależnościami usług jest słaba (brak propagacji trace-id, niespójne nazwy usług), wynik będzie tylko ładniejszą wersją chaosu.

Łączenie logów z metrykami i tracerami

Analiza logów w izolacji jest wygodna, ale bywa myląca. Anomalia w logach bez potwierdzenia w metrykach może być wynikiem zmiany poziomu logowania, a nie realnej awarii. Z kolei wzrost latency bez zmiany treści logów często wynika z „cichego” spowolnienia zależnej usługi.

Praktyczne minimum integracji to:

  • wspólne trace-id / correlation-id między logami, metrykami APM i spanami z systemu tracingu,
  • spójna taksonomia usług (te same identyfikatory w logach, Prometheusie i systemie tracingu),
  • wspólne okresy agregacji (te same przedziały czasowe dla logów i metryk, np. 1 minuta).

Po spięciu tych trzech źródeł można trenować modele, które biorą na wejściu zarówno cechy z logów, jak i zagregowane metryki – redukuje to liczbę fałszywych alarmów i pozwala łatwiej odróżnić „szum logowania” od realnych problemów wydajnościowych.

Serwery w centrum danych oświetlone niebiesko-czerwonym światłem
Źródło: Pexels | Autor: panumas nikhomkhai

Przegląd typów modeli AI do analizy logów i anomalii

Modele regułowe i statystyka opisowa jako punkt startu

Zanim pojawi się jakikolwiek „inteligentny” model, sensownie skonfigurowane reguły i prosta statystyka często dają największy zwrot z inwestycji. Kilka klasycznych wzorców:

  • statyczne progi – np. error rate > X% w ciągu 5 minut dla danej usługi,
  • porównanie do mediany / percentyla historycznego – „dzisiaj w tej godzinie masz 3× więcej błędów niż przeciętnie w tym przedziale”,
  • reguły korelacyjne – prosty if-then na poziomie szablonów logów: jeżeli liczba komunikatów typu A rośnie, a typu B spada, sygnalizuj podejrzaną sytuację.

Te metody nie są „AI”, ale pełnią ważną rolę: tworzą bazowy poziom detekcji, do którego można porównywać kolejne modele. Bez takiego baseline’u trudno rzetelnie ocenić, czy nowy algorytm rzeczywiście poprawia wykrywalność anomalii, czy tylko zmienia ich rozkład.

Klasyczne metody nienadzorowane: od z-score do Isolation Forest

Gdy etykiety „normalne/anomalia” są rzadkie lub w ogóle nie istnieją (typowy przypadek przy logach), zwykle zaczyna się od nienadzorowanej detekcji anomalii na cechach liczbowych i kategorycznych.

  • Metody oparte na rozkładzie – założenie, że cechy mają mniej więcej „zdrowy” rozkład (często z-normalizowany). Anomalią są punkty o dużym odchyleniu (z-score, odległość Mahalanobisa). Działa przy niewielkiej liczbie cech i względnie stabilnym systemie.
  • Isolation Forest – buduje wiele losowych drzew decyzyjnych, które „izolują” punkty. Anomalie wymagają krótszej ścieżki izolacji. Zwykle dobrze skaluje się na setki cech i duże zbiory danych, pod warunkiem sensownego doboru parametrów (liczba drzew, głębokość).
  • LOF / kNN-based – Local Outlier Factor i inne metody oparte na gęstości w przestrzeni cech. Dobrze wykrywają lokalne anomalie (dziwne względem najbliższych sąsiadów), słabo działają przy bardzo wysokich wymiarach bez wcześniejszej redukcji.

Zachowanie tych metod mocno zależy od jakości cech. Jeżeli większość informacji siedzi w jednym źle znormalizowanym polu (np. czas odpowiedzi w milisekundach obok innych cech w zupełnie innym skali), efektem będzie lawina pseudoanomalii.

Autoenkodery i rekonstrukcja wzorca normalności

Autoenkoder próbuje skompresować wektor cech do niższego wymiaru, a następnie go odtworzyć. Jeśli model trenowany jest na danych „w miarę normalnych”, to:

  • wysoki błąd rekonstrukcji sugeruje, że dany event lub okno czasowe jest nietypowe,
  • warstwa ukryta działa jako gęsta reprezentacja „typowego” zachowania systemu.

Autoenkodery można stosować zarówno do pojedynczych eventów, jak i do wektorów agregatów z okien czasowych. W sekwencyjnych zastosowaniach sensowne są Sequence-to-Sequence autoenkodery z LSTM/GRU, które próbują odtworzyć całe sekwencje logów lub metryk.

Pułapka: jeżeli podczas treningu do danych „normalnych” dostaną się powtarzające się anomalie (np. powracający, ale niepożądany wzorzec), model uzna je za część normy. Dla środowisk, gdzie często „żyje się w trybie awaryjnym”, trzeba więc selektywnie wybierać okresy referencyjne.

Modele sekwencyjne: LSTM, GRU i odchylenia w czasie

W wielu systemach anomalia nie jest pojedynczym punktem, ale nienaturalną zmianą sekwencji: inną kolejnością endpointów, zagęszczeniem błędów w krótkim czasie, nieobecnością spodziewanych eventów. Klasyczne modele sekwencyjne dobrze się tu sprawdzają:

  • LSTM / GRU – uczą się przewidywać następny event, klasę szablonu lub rozkład cech w kolejnym oknie czasowym. Wysoka niespodzianka (wysoka entropia albo niski likelihood przewidzianego eventu) jest wskaźnikiem anomalii.
  • Sequence labeling – model oznacza każdy element sekwencji jako normalny/anomalny, biorąc pod uwagę kontekst kilkunastu/kilkudziesięciu kroków.

Kluczowe decyzje dotyczą długości sekwencji i sposobu grupowania (po użytkowniku, hoście, usłudze, trace-id). Zbyt krótkie sekwencje gubią kontekst; zbyt długie – rozmywają sygnał i podnoszą koszty obliczeniowe. W praktyce testuje się kilka długości równolegle i porównuje skuteczność.

Transformatory i modele sekwencyjno-kontekstowe

Transformery w analityce logów nie są „magicznie lepsze” od LSTM, ale dobrze radzą sobie z:

  • dłuższym kontekstem (setki kroków),
  • równoległym przetwarzaniem,
  • łączeniem wielu typów wejść (embeddingi szablonów, cechy numeryczne, informacje o czasie).

Typowy schemat to LogBERT-like model: logi zamienione na tokeny (id szablonów), wejściowe embeddingi, maskowanie części tokenów i uczenie modelu ich przewidywania. Później log sequence embedding służy do detekcji sekwencji odbiegających od typowych.

Ograniczenia są prozaiczne: koszt trenowania i inferencji. Przy dużych wolumenach logów często nie opłaca się uczyć jednego dużego modelu. Zamiast tego trenuje się kilka mniejszych per domena (np. osobno dla warstwy frontowej i backendowej), albo ogranicza wejście do już zagregowanych reprezentacji (okna czasowe, szablony).

Modele grafowe dla sesji i trace’y (GNN w praktyce)

Jeżeli logi są dobrze powiązane z trace-id, ścieżkę requestu można potraktować jako mały graf (lub sekwencję na grafie), a nie tylko listę zdarzeń. Modele grafowe umożliwiają np.:

  • uczenie reprezentacji całego trace’a jako wektora (graph embedding),
  • wyszukiwanie „podgrafów anomalii” – fragmentów, które rzadko występują w innych trace’ach,
  • porównywanie nowego trace’a z „kanonicznymi” wzorcami z przeszłości.

W detekcji incydentów rozproszonych to podejście bywa skuteczniejsze niż analiza każdego logu osobno. Cena: większa złożoność implementacyjna (konieczność budowy grafu trace’ów) i trudniejsza interpretacja wyniku dla zespołów, które nie mają doświadczenia z GNN.

Modele nadzorowane: klasyfikacja incydentów i predykcja awarii

Tam, gdzie dostępne są etykiety (np. incydenty z systemu ticketowego, ręcznie oznaczone anomalie), można przejść na tryb nadzorowany. Typowe zastosowania:

  • klasyfikacja typu zdarzenia – błąd aplikacyjny vs problem sieciowy vs błąd konfiguracji,
  • predykcja awarii – przewidywanie, czy w najbliższym oknie czasowym wystąpi incydent na podstawie obecnych logów i metryk,
  • routing incydentów – przewidywanie, do którego zespołu on-call należy skierować alert, na podstawie wzorca logów.

Modele nadzorowane (drzewa, gradient boosting, sieci neuronowe) zwykle wygrywają z nienadzorowanymi pod względem jakości, ale cierpią na brak etykiet. Typowy kompromis to podejście dwuetapowe: najpierw nienadzorowana detekcja kandydatów na anomalie, później ręczne oznaczanie części z nich i dopiero trenowanie modelu nadzorowanego na tym podzbiorze.

Modele generatywne (LLM) do rozumienia i grupowania logów

Duże modele językowe w obszarze logów mają dwa główne zastosowania: ułatwienie pracy człowieka i budowę bogatszych reprezentacji, które potem wykorzystuje się w innych modelach.

  • Ustrukturyzowanie i streszczanie – LLM może „przeczytać” dłuższą sekwencję logów i wygenerować zwięzły opis zdarzenia, sugerując potencjalną przyczynę. To bardziej asystent analityka niż automat do wykrywania anomalii.
  • Embeddingi semantyczne – wygenerowane przez LLM wektory reprezentujące całe komunikaty logów, trace’y lub incydenty. Te embeddingi można potem klastrować, wizualizować, używać do nearest-neighbor search („pokaż incydenty podobne do tego”).

Wykorzystanie LLM w trybie „online anomaly detection” bywa kosztowne. Rozsądniejsze są scenariusze pół-offline: proste modele sygnalizują podejrzane fragmenty, a LLM jest używany tylko do ich opisania, pogrupowania i ułatwienia człowiekowi decyzji.

Modele hybrydowe: łączenie reguł, ML i wiedzy domenowej

W praktycznych wdrożeniach rzadko kończy się na jednym modelu. Bardziej realistyczny obraz to:

  • warstwa reguł i filtrów – odrzuca oczywiste „false positives”, wymusza twarde zasady (np. bezpieczeństwo),
  • warstwa detekcji nienadzorowanej – generuje kandydatów na anomalie na podstawie cech liczbowych i sekwencji,
  • warstwa nadzorowana lub półnadzorowana – uczy się, które anomalie są dla zespołu realnie istotne, na podstawie historii reakcji (ack/close, eskalacja),
  • opcjonalna warstwa LLM – grupuje i opisuje wybrane anomalia, aby skrócić czas analizy ręcznej.

Najważniejsze punkty

  • Logi są bogatym źródłem wiedzy o zachowaniu systemu, ale ekstremalnie zaszumionym – anomalia stanowi zwykle promil wpisów, więc bez solidnego przygotowania danych modele AI mają małe szanse na sensowne wyniki.
  • Typ logów (systemowe, aplikacyjne, sieciowe, bezpieczeństwa) silnie determinuje strategię analizy: od prostego parsowania i agregatów po bardziej złożone modele sekwencyjne, co oznacza, że „jedno uniwersalne podejście AI do logów” zazwyczaj się nie sprawdza.
  • AI przy logach ma głównie zastosowanie operacyjne: wykrywa anomalie, prognozuje incydenty, wspiera root cause analysis i triage alertów, ale nie zastępuje klasycznego monitoringu – raczej wypełnia luki tam, gdzie reguły stają się zbyt liczne lub zbyt złożone.
  • Klasyczne reguły i progi działają najlepiej tam, gdzie da się jasno opisać warunek i system zmienia się rzadko; AI zaczyna mieć przewagę dopiero przy dużej liczbie źródeł logów, częstych deployach i złożonych sekwencjach zdarzeń, których nie da się utrzymać w postaci ręcznie pisanych korelacji.
  • Wysoka jakość i spójność logowania są często ważniejsze niż „wyrafinowany” model – lepsza higiena logów oraz kilka prostych algorytmów nienadzorowanych potrafią dać większy efekt niż kosztowny projekt z zaawansowaną architekturą sekwencyjną.
  • Bez możliwie pełnego pokrycia źródeł (serwery, kontenery, sieć, chmura, aplikacje) powstają „ślepe plamy”, przez które nawet bardzo dobry model będzie mylnie interpretował kontekst i generował zarówno fałszywe alarmy, jak i groźne przeoczenia.