Przejdź do treści

Wtyczka Analizator logów

Zamień edytor w pełnoprawny warsztat logów: parsuj ustrukturyzowane pliki logów przez edytowalne profile, nawiguj po sparsowanych polach i znacznikach czasu, scalaj wiele źródeł na jednej osi czasu, śledź pojedyncze żądanie między źródłami i analizuj częstości / percentyle / top-N wartości — wszystko bez ładowania surowego tekstu do zwykłej karty edytora.

Gdzie ją znaleźć

Wtyczka dodaje trzy pozycje w menu Analizator logów:

  • Analizator logów ▸ Otwórz jako log… — otwiera pojedynczy plik logu w dedykowanym oknie Widoku logu.
  • Analizator logów ▸ Otwórz scalone logi… — wybierz dwa lub więcej plików, każdemu przypisz profil i zobacz je przeplecione na jednej osi czasu.
  • Analizator logów ▸ Otwórz log systemowy… (tylko Windows) — odpytuj Dziennik zdarzeń Windows w tym samym widoku, z filtrami zepchniętymi do PowerShellowego Get-WinEvent.

Strona Preferencje ▸ Wtyczki ▸ Analizator logów pozwala ustawić domyślne chipy poziomów, profil zapasowy dla plików niepasujących do globów, próg „ostrzeż przed parsowaniem plików powyżej N MB", domyślny tryb filtra oraz interwał odpytywania follow-tail — jedno pokrętło dla timera ogona pliku i strumienia logu systemowego (każde odpytanie Dziennika zdarzeń Windows uruchamia proces PowerShell, więc ciężkie źródła mogą chcieć wolniej).

Duże pliki parsują się w wątku tła z żywym licznikiem rekordów, a kosztowne agregacje (szablony komunikatów, anomalie) też liczą się w tle — pasek stanu pokazuje „Analizowanie statystyk w tle…", a panele wypełniają się, gdy są gotowe, więc okno pozostaje responsywne. Przy bardzo dużych plikach statystyki agregują najnowsze 150 000 rekordów, a oś czasu próbkuje cały zakres.

Widok logu (jeden plik)

Otwarcie logu pokazuje dedykowane okno Widok logu. Odzwierciedla ergonomię tabelowych okien edytora (jak okno Porównania) i trzyma się z dala od paska kart edytora.

Układ

  • Pasek narzędzi — chipy poziomów (TRACE…FATAL), tryb filtra + linia filtra, Następny / Poprzedni błąd (F8 / Shift+F8), Idź do czasu (Ctrl+G).
  • Pasek osi czasu u góry — wolumen zdarzeń w kubełkach czasu, kolorowany poziomami. Przeciągnij zakres, aby filtrować po czasie; kliknij słupek, aby przeskoczyć tabelą do pierwszego rekordu w tym kubełku lub po nim.
  • Tabela pośrodku — Czas / Poziom / Źródło / Komunikat, zwirtualizowana, więc przewija się płynnie nawet przy setkach tysięcy rekordów.
  • Panel szczegółów pod tabelą — pełny, surowy wielolinijkowy wpis wybranego wiersza.
  • Panel statystyk zadokowany po prawej — liczniki per poziom, częstość zdarzeń, wybierak percentyli (p50/p95/p99 po dowolnym polu liczbowym, domyślnie bytes), rozkład klas statusów HTTP (1xx…5xx, ukryty bez pola status) i tabela top-N po dowolnym polu (domyślnie url, limit 25 wierszy).

Tabela rekordów i panel szczegółów używają czcionki edytora z Preferencje ▸ Ogólne — tego samego kroju i rozmiaru co zwykła karta edytora, dzięki czemu znaczniki czasu i poziomy układają się kolumna w kolumnę. Zmiana tego ustawienia działa też na już otwarte widoki dziennika, bez potrzeby ich ponownego otwierania. Tak samo jest z widokiem scalonym, jego panelami obok siebie i diagramem sekwencji. Pasek narzędzi, wiersz filtra i panel statystyk zachowują czcionkę interfejsu: to obudowa, a nie treść dziennika.

Tryby filtra

Linia filtra na pasku narzędzi przyjmuje pięć rodzajów wyrażeń; tryb wybierasz z listy po jej lewej:

Tryb Co dopasowuje
Zwykły Podłańcuch bez rozróżniania wielkości liter w surowej linii.
Słowa Tokeny rozdzielone białymi znakami; każdy token musi wystąpić gdzieś w linii, w dowolnej kolejności. phpinfo GET dopasowuje linię zawierającą i phpinfo, i GET.
Wieloznaczniki Glob * i ? na surowej linii, bez rozróżniania wielkości liter.
Regex Zwykły wzorzec QRegularExpression, domyślnie bez rozróżniania wielkości liter.
Zapytanie Ustrukturyzowana gramatyka z predykatami pól, poziomów i czasu plus AND/OR/NOT i nawiasy.

Przykłady trybu Zapytanie:

level>=WARN
status:500 AND method:POST
message~/timeout|refused/ AND @time in [09:00..09:05]
NOT (source:nginx OR source:apache)
level>=ERROR OR (status:5\d\d AND method:POST)

Linia filtra tłumi pisanie przez 200 ms, żeby tabela nie filtrowała się przy każdym naciśnięciu klawisza; Enter albo utrata fokusu stosuje filtr od razu, wyczyszczenie linii też. Gdy wyrażenie Wieloznaczniki / Regex / Zapytanie się nie kompiluje, linia robi się czerwona, a podpowiedź pokazuje diagnostykę — proxy trzyma na ekranie poprzedni poprawny filtr, więc tabela nie pustoszeje podczas pisania.

Nawigacja

  • F8 / Shift+F8 — następny / poprzedni rekord błędu lub krytyczny.
  • Ctrl+G — idź do konkretnego czasu (UTC, popup z kalendarzem).
  • Kliknięcie słupka osi czasu skacze do pierwszego rekordu w kubełku.

Te trzy skróty są remapowalne w Mapowaniu skrótów (kategoria Analizator logów); otwarte Widoki logu stosują remap natychmiast, a podpowiedzi paska narzędzi pokazują bieżący skrót.

Żywe parsowanie + anulowanie

Duże pliki pokazują rekordy w dziesiątkach milisekund; parsowanie trwa w tle, a tabela rośnie w miarę napływu rekordów. Filtrowanie, przewijanie i F8 działają, gdy parsowanie jeszcze trwa. Zamknięcie okna szybko zatrzymuje workera.

Widok scalonych logów

Analizator logów ▸ Otwórz scalone logi… pozwala badać problem rozciągnięty na wiele źródeł — log klienta plus log serwera, log aplikacji plus dziennik systemowy, web access plus error itd.

Wybór profilu per plik

Po wyborze dwóch lub więcej plików widzisz małe okno z wierszem na plik i listą profili per wiersz. Lista jest wstępnie wybrana przez dopasowanie nazwy pliku do globów nazw każdego profilu (bez rozróżniania wielkości liter). Dla typowego wdrożenia nginx access.log sam wybiera nginx — access log (default combined), a error.log — nginx — error log. Przed OK możesz każdy wiersz nadpisać ręcznie.

Układ

  • Pasek narzędzi — chipy poziomów, linia filtra z listą trybów, kontrolki śledzenia (lista + Śledź / Wyczyść), przełącznik Diagram sekwencji, przełącznik Obok siebie.
  • Pasek osi czasu u góry — skumulowany histogram per źródło z jednym torem na źródło, więc skorelowane wybuchy widać gołym okiem.
  • Baner śledzenia nad tabelą — bursztynowy pasek widoczny tylko przy aktywnym filtrze śledzenia: Śledzenie <field> = <value> — N wierszy we wszystkich źródłach.
  • Główny obszar stosu — trzy strony przełączane z paska narzędzi:
    • Tabela (domyślnie): jeden wiersz na scalony rekord z kolumnami Czas / Źr / Poziom / Logger / Komunikat; kolor tekstu kolumny Źr to kolor toru źródła, więc tożsamość źródła skanujesz wzrokiem.
    • Diagram sekwencji — zobacz Śledzenie.
    • Panele obok siebie — zobacz Obok siebie.
  • Panel szczegółów pod tabelą.

Filtry, które się składają

W widoku scalonym potok filtrów działa w tej kolejności, wszystkie nakładają się na siebie:

  1. Widoczność źródeł — pole wyboru w lewym marginesie osi czasu, po jednym na pas, obok nazwy i koloru źródła. Odznaczony pas zostaje w widoku, przygaszony: musi zostać, bo to pole jest jedyną drogą powrotu. Prawy przycisk na marginesie daje Pokaż tylko to źródło / Pokaż wszystkie źródła.
  2. Chipy poziomów — TRACE…FATAL.
  3. Śledzenie — niżej.
  4. Filtr tekstowy — Zwykły / Słowa / Wieloznaczniki / Regex / Zapytanie (te same tryby i zachowanie co w widoku jednego pliku, zastosowane do scalonego strumienia).

Możesz więc np. wykonać level>=ERROR AND status:500 naraz na logach access i error nginxa jednym wyrażeniem i śledzić jednego klienta przez oba — filtr śledzenia zawęża zbiór dalej, nie psując filtrów poziomu / źródła / tekstu.

Śledzenie (Follow trace)

  1. Wybierz klucz korelacji w liście Ślad: paska narzędzi. Jest zasiana konwencjonalnym zestawem (trace_id / request_id / session_id / correlation_id / span_id / xRequestId) i każdą odrębną nazwą pola faktycznie obecną w załadowanych rekordach. W razie potrzeby wpisz własną nazwę.
  2. Wybierz wiersz w tabeli.
  3. Kliknij Śledź — albo kliknij wiersz prawym przyciskiem i wybierz Śledź: \<field>=\<value> dla dowolnego konwencjonalnego klucza, jaki rekord niesie (droga jednym ruchem, bez kroku z listą).

Tabela natychmiast filtruje się do rekordów dzielących wartość tego klucza we wszystkich źródłach. Kliknij Wyczyść ślad, aby zdjąć filtr.

Diagram sekwencji

Gdy filtr śledzenia jest aktywny i widoczne są dokładnie 2–4 źródła, staje się dostępny przełącznik Diagram sekwencji. Przełącza główny obszar w diagram o stałych torach:

  • Każde widoczne źródło to pionowy tor z kolorową próbką w etykiecie u góry.
  • Jeden wiersz na rekord, czas płynie z góry na dół. Rzeczywisty znacznik czasu jest po lewej, więc nie tracisz precyzji; wiersze są rangowe (stała wysokość), a nie proporcjonalne do czasu, bo prawdziwe śledzenie ma wybuchy i długie pauzy — oś proporcjonalna zmarnowałaby większość ekranu na pauzy.
  • Kolorowa kropka na torze właściciela plus subtelna szara strzałka między kolejnymi rekordami na różnych torach — dosłownie widać, jak żądanie odbija się między systemami.
  • Chip poziomu i tekst komunikatu po prawej.

Klik w wiersz diagramu przewija tabelę pod spodem do tego rekordu. Wyłącz przełącznik, aby wrócić do tabeli.

Przy >4 źródłach diagram jest wyłączony i zostaje widok tabeli.

Panele obok siebie

Gdy widoczne są dokładnie dwa źródła, dostępny staje się przełącznik Obok siebie. Dzieli główny obszar na dwa panele tabel — po jednym źródle — z pozycjami przewijania sprzężonymi po znaczniku czasu: przewiń jeden panel, a drugi podąża do najbliższego rekordu w tym czasie lub po nim. Dryf zegarów serwerów widać naturalnie jako rozjeżdżanie się paneli.

Przełączniki Diagram sekwencji i Obok siebie wykluczają się wzajemnie (włączenie jednego wyłącza drugi); oba wracają do widoku tabeli, gdy liczba aktywnych źródeł wyjdzie poza obsługiwany zakres.

Zestawy rotacji to jeden pas

Wybranie trzech plików z jednego zestawu rotacji to wybranie jednego logu, więc wczytują się jako jeden pas. Okno wyboru pokazuje wiersz na pas, z segmentami wypisanymi pod spodem od najstarszego, a pas jest podpisany nazwą swojego najnowszego pliku z liczbą starszych — MxAPILog.txt (+2).

Prawy przycisk na pasie w timeline daje Pokaż każdy zrotowany plik osobno, a po rozdzieleniu Scal zrotowane pliki w jeden pas. Rozdzielenie to przegrupowanie tego, co jest już w pamięci — nic nie jest czytane ponownie — ale zmienia znaczenie wiersza, więc tabela traci zaznaczenie.

Źródła muszą podawać porównywalny czas

Scalenie umieszcza rekordy z kilku źródeł na jednej osi, co ma sens tylko wtedy, gdy wszystkie potrafią podać tyle samo daty. Sysloga bez roku nie da się umieścić względem logu datowanego bez wymyślenia roku, a logu budowania bez znaczników czasu nie da się umieścić w ogóle. Mieszanie jest odrzucane z góry, z komunikatem wymieniającym, które źródła należą do której grupy. Scalaj źródła tego samego rodzaju albo otwórz je osobno.

Przywracanie

Widok scalony wraca razem z sesją. Zapisywany jest profil wybrany dla każdego pasa i pliki, do których ten pas się rozwinął; rekordy są czytane ponownie w tle, więc zakładka pojawia się od razu i zapełnia w locie. Pliki, które zniknęły, i profile, które skasowano, są pomijane i odnotowywane w logu, zamiast zamieniać się w pytanie przy uruchomieniu.

Natywne logi systemowe (Windows)

Analizator logów ▸ Otwórz log systemowy… odpytuje Dziennik zdarzeń Windows bez potrzeby pliku na dysku. Okno pyta o kanał (Application / System / Security / nazwa własna), opcjonalny minimalny poziom i limit rekordów. Wtyczka uruchamia PowerShellowe Get-WinEvent | ConvertTo-Json -Compress z filtrem zepchniętym w dół, po czym parsuje wyjściowy NDJSON dołączonym profilem windows-event-log.

Akcja jest rejestrowana tylko, gdy host naprawdę ma działające źródło Dziennika zdarzeń Windows — na Linuksie i macOS jest autentycznie nieobecna, a nie wyszarzona.

Źródła unified log macOS i journald Linuksa są planowane i wpasują się za ten sam wewnętrzny interfejs, bez zmian UI, gdy wylądują.

Profile

Silnik nie ma wbudowanych, specjalnie traktowanych parserów. Każdy obsługiwany format — Apache, nginx, syslog, JSON Lines, logfmt, CSV, Dziennik zdarzeń Windows — to plik JSON LogProfile dostarczany w katalogu log-profiles/ aplikacji. Profile użytkownika leżą w folderze log-profiles/ katalogu konfiguracji użytkownika i nadpisują dołączone po id.

Każdy profil opisuje:

  • model linii — regex, json, logfmt, csv albo delimited.
  • znacznik czasu — które pole, akceptowane formaty w stylu strftime, strefa źródłowa, jednostki epoki.
  • poziom — które pole plus mapowanie surowych tokenów na kanoniczny enum Trace / Debug / Info / Warn / Error / Fatal.
  • kontynuację — jak kolejne linie kleją się do bieżącego rekordu (stosy Javy stają się jednym wpisem, nie trzydziestoma).
  • pola pochodne — dodatkowe pola liczone pod-wzorcem po istniejącym polu. Dołączone profile apache + nginx używają tego, by wystawić jednolite pole client_ip, dzięki czemu Śledź widoku scalonego koreluje zdarzenia access i error tego samego klienta w obu źródłach.
  • rotację — które pliki tworzą jeden logiczny log i w jakiej kolejności. Zobacz Rotacja: opisanie zestawu plików.

Nie trzeba pisać tych plików ręcznie: edytor do nich — z chwytaczem pól, aliasami w stylu grok i żywym testerem znaczników czasu — jest opisany w sekcji Edycja profili.

Czas pokazywany z dokładnością, jaką podaje log

Nie każdy log podaje pełną datę. Syslog RFC 3164 podaje miesiąc, dzień i godzinę, ale nie rok; niektóre logi wbudowane i firmowe podają samą godzinę; wyjście z budowania nie podaje nic.

Kolumna Czas pokazuje dokładnie to, co było w linii — 13:36:55, Oct 10 14:32:52 albo pełny znacznik z UTC — i nigdy nie wypełnia luki zgadywaniem. Tak samo działa eksport TSV i podgląd w edytorze profili, więc wymyślony rok nie może opuścić aplikacji i zostać wzięty dalej za prawdziwy.

Sortowanie, oś czasu i statystyki działają wewnątrz takiego pliku normalnie: brakujące części są kotwiczone wewnętrznie, żeby rekordy pozostały porównywalne między sobą. Po prostu nigdy nie są pokazywane.

Edycja profili

Analizator logów ▸ Edytuj profil… wypisuje każdy profil z plakietką Wbudowany albo Własny. Wybranie profilu go wczytuje.

Profile wbudowane są tylko do odczytu, tak samo jak wbudowane motywy: formularz jest widoczny, ale nieaktywny, a Klonuj to droga do ich zmiany. Klon dostaje wolny identyfikator, więc kopia nigdy nie przesłoni po cichu profilu, z którego powstała. Nowy zaczyna od zera, Usuń kasuje profil własny, a przełączenie się z niezapisanej pracy najpierw pyta.

Gdy importowany profil ma identyfikator taki jak wbudowany, zostaje zapisany pod wolnym identyfikatorem zamiast go zastąpić — a edytor mówi, pod jakim.

Rotacja: opisanie zestawu plików

Log zrotowany to jeden strumień pocięty na kilka plików. Profil mówi, które pliki należą do siebie, za pomocą dwóch nazw — nic więcej nie jest potrzebne, a skoro opis jest jeden, nie ma czemu przeczyć.

Pole Znaczenie
liveName Plik, do którego trwa zapis.
rotatedName Kształt, jaki przyjmują starsze pliki.
indexOrder Który koniec numeracji jest najnowszy.
orderBy Skąd bierze się kolejność. Niemal zawsze name.

Placeholdery

Obie nazwy je przyjmują. Poza nimi każdy znak jest dosłowny — . to kropka, a nie „dowolny znak", a * to gwiazdka, a nie wieloznacznik.

Placeholder Znaczy
%LIVE% Plik otwarty przez użytkownika. Użyj, gdy profil nie może znać nazwy z góry.
%N Numer rotacji. Odczytywany jako liczba, więc _10 trafia za _9, a nie między _1 i _2.
%Y %y Rok, cztero- lub dwucyfrowy. Dwucyfrowe używają zwykłego progu: 69–99 to 19xx, 00–68 to 20xx.
%m %b %B Miesiąc jako liczba, skrót (Jul) albo pełna nazwa (July).
%d %j Dzień miesiąca albo dzień roku.
%H %M %S Godzina, minuta, sekunda — dla schematów rotujących częściej niż raz dziennie.
%% Dosłowny znak procenta.

To te same pola strftime, których profil używa w formatach znacznika czasu, więc nie ma drugiego zestawu do nauczenia.

Rozszerzenie kompresji (.gz, .zip, .bz2, .xz) jest obsługiwane automatycznie i nie może pojawić się w żadnej z nazw: każdy schemat dokleja je na końcu, po tym, co opisuje wzorzec.

Trzy stany liveName

Wartość Kiedy
%LIVE% Profil ogólnego przeznaczenia, który nie może znać nazwy — zestaw jest zakotwiczony w pliku, który otwarto.
Dosłowna nazwa, np. access.log Profil napisany dla jednej aplikacji, której plik bieżący zawsze tak się nazywa.
Pusta Nie ma pliku bieżącego bez numeru: każdy plik jest numerowany albo datowany. Tak działa IIS i java.util.logging.

Przykłady

Schemat liveName rotatedName
logrotate %LIVE% %LIVE%.%N
logrotate z dateext %LIVE% %LIVE%-%Y%m%d
Apache / nginx access.log access.log.%N
IIS (pusta) u_ex%y%m%d.log
log4j2 / logback, domyślne rolowanie %LIVE% app-%Y-%m-%d-%N.log
Rotacja godzinowa %LIVE% app-%Y-%m-%d-%H.log
java.util.logging (pusta) java%N.log

Jak ustalana jest kolejność

Przy orderBy: name — czyli domyślnie — najpierw decyduje data z nazwy, numer rozstrzyga remisy w obrębie daty, a plik bez numeru jest plikiem bieżącym, czyli najnowszym. indexOrder mówi, w którą stronę biegną numery: higher-is-older dla logrotate i spdlog, higher-is-newer dla Seriloga, Boost.Log i wszystkiego, co liczy w górę wraz z upływem czasu. Z samej nazwy nie da się tego rozróżnić — dlatego musi to powiedzieć profil.

Pozostałe wartości orderBy są dla zestawów, których numerom nie można ufać. Rotacja cykliczna używa w kółko tych samych kilku numerów, więc numer oznacza slot, a nie wiek; first-record-time czyta wtedy pierwszy znacznik czasu z każdego pliku, a mtime schodzi do systemu plików.

Jeśli wybrano name, a nazwy okażą się nie nieść ani daty, ani numeru, kolejność spada na pierwszy rekord, potem na mtime, potem na samą nazwę — i pasek stanu mówi, na którą, bo mtime jest nadpisywany przez kopiowanie, rozpakowanie, przywrócenie z backupu albo przełączenie gałęzi.

Data w nazwie pliku nigdy nie staje się znacznikiem czasu rekordu

Daty odczytane z nazw plików służą wyłącznie do ustawienia segmentów w kolejności. Rekordy zawsze biorą czas z linii, z której zostały sparsowane. Plik o nazwie access.log-20260730 nadal zawiera rekordy z takich godzin, jakie podają jego własne linie.

Wzorce odrzucane

Wzorzec z dwoma %N albo z %N przylegającym do pola daty jest odrzucany przy wczytywaniu profilu, a rotacja zostaje dla niego wyłączona, z powodem w diagnostyce. app_%N%Y%m%d.log przy nazwie app_1220260730.log daje się odczytać na kilka sposobów, a ciche wybranie jednego z nich pomyliłoby kolejność bez niczego na ekranie, co by to wyjaśniało. Wstaw między nie dowolny znak literalny — każdy realny schemat i tak to robi.

Edytor profili sprawdza obie nazwy w trakcie pisania, więc odrzucony wzorzec widać już tam, a nie dopiero przy otwieraniu.

Podział po uruchomieniach aplikacji

Uruchomienie to jedno życie aplikacji od startu do zatrzymania i nie jest tym samym co plik: rotacja po rozmiarze tnie uruchomienie na kilka plików, a log rotowany wyłącznie po rozmiarze może pomieścić kilka uruchomień w jednym pliku.

Jeśli log wypisuje linię przy starcie — Volluto logging system started…, Begin file log, baner frameworka — wpisz pasujący do niej regex w pole runStartMarker profilu. Prawy przycisk na pasie w osi czasu daje wtedy Podziel po uruchomieniach aplikacji, a każde uruchomienie staje się osobnym pasem. Pozycja pojawia się tylko wtedy, gdy rekordy faktycznie zawierają więcej niż jedno uruchomienie.

Bez markera granice da się jedynie zgadywać z przerw w czasie, a to zgadywanie jest domyślnie wyłączone i to celowo. Uruchomienie to pojęcie logów aplikacyjnych; nginx, apache, syslog i logi kontenerów to ciągłe usługi, które nie mają uruchomień w ogóle, a spokojna noc zostałaby inaczej odczytana jako setki restartów. Tam, gdzie zgadywanie jest używane, dostosowuje się do rytmu samego logu i jest odrzucane w całości, gdy daje uruchomienia zbyt krótkie, by były prawdziwe.

Czas cofający się wewnątrz źródła jest zawsze traktowany jako granica i zawsze zgłaszany — oznacza albo restart, albo segmenty ustawione w złej kolejności, a o obu warto wiedzieć.

Motywy

Kolory per poziom pochodzą z motywu — wtyczka rejestruje kategorię palety na kanoniczny poziom, Edytor motywów je pokazuje, a każdy motyw może je nadpisać. Zmiana motywu aktualizuje kolumnę poziomu, pasek osi czasu, panel statystyk i diagram sekwencji równocześnie.

Zobacz też

  • Porównanie / diff — okno Porównania, na którym wzorowane są okna Analizatora logów.
  • Logowanie i diagnostyka — własny plik logu edytora (co innego niż widok Analizatora logów na dowolne formaty logów).