Jednolity harmonogram audytu: schemat i UI — kto co zrobił, kiedy i dlaczego
Zaprojektuj jednolitą oś czasu audytu, która pokazuje kto co zrobił, kiedy i dlaczego — obejmując logowania, zmiany danych i kroki workflow, wraz z praktycznym schematem i układem UI.

Czym jest jednolity harmonogram audytu (i dlaczego pomaga)
Jednolity harmonogram audytu to pojedynczy, czytelny strumień zdarzeń w twoim produkcie, posortowany chronologicznie. Pozwala zrozumieć, co się stało, bez przeskakiwania między narzędziami. Zamiast oddzielnych logów logowania, tabel historii bazy danych i trackerów workflow, masz jedno miejsce, które opowiada historię.
Zespół zwykle odczuwa problem, gdy coś pójdzie nie tak: klient mówi, że nie zatwierdził zmiany, rekord „tajemniczo” się zaktualizował lub konto wygląda na przejęte. Dane często są dostępne, ale rozproszone, inaczej oznaczone i brak im drobnych szczegółów, które zamieniają surowe logi w wyjaśnienie. Dochodzenia się przedłużają, a ludzie zaczynają zgadywać.
Jednolity harmonogram audytu powinien odpowiadać na pięć pytań:
- Kto to zrobił (użytkownik, usługa czy system)
- Co zrobili (akcja i obiekt)
- Kiedy to się wydarzyło (dokładny znacznik czasu, w jasnej strefie czasowej)
- Gdzie to się wydarzyło (web, mobile, API)
- Dlaczego to się wydarzyło (powód, żądanie lub zatwierdzenie)
Zakres ma znaczenie. Dla większości produktów chcesz zdarzeń obejmujących logowania i sesje, zmiany danych CRUD, kroki workflow (jak zatwierdzenia i zmiany statusu) oraz kluczowe zdarzenia systemowe (jak zmiany uprawnień czy nieudane próby dostępu). Jeśli dobrze to wytłumaczysz, rozwiążesz większość codziennych pytań audytowych.
Warto też jasno powiedzieć, czym to nie jest. Jednolity harmonogram audytu to nie pełne SIEM i nie jest to głęboka analityka. Celem są szybkie, wiarygodne odpowiedzi dla wsparcia, przeglądów bezpieczeństwa i wewnętrznej odpowiedzialności.
Jeśli budujesz aplikacje na platformie no-code jak AppMaster, jednolita oś czasu staje się jeszcze bardziej przydatna, ponieważ logika backendu, akcje UI i integracje mogą emitować ten sam format zdarzeń. To sprawia, że „historia” produktu jest spójna dla każdego, kto jej potrzebuje.
Zdarzenia do uwzględnienia: logowania, zmiany danych, kroki workflow
Jednolita oś czasu działa tylko wtedy, gdy pobiera dane tam, gdzie dzieją się rzeczywiste akcje. Większość produktów ma cztery główne źródła: uwierzytelnianie (logowania i sesje), zmiany danych (create, update, delete), kroki workflow (zatwierdzenia, przypisania, zmiany statusu) oraz integracje (webhooki, importy, boty).
Zacznij od zdefiniowania małego zestawu kategorii zdarzeń i trzymaj się ich. Kategorie powinny opisywać intencję, nie implementację. Na przykład reset hasła i rotacja klucza API to oba zdarzenia dostępu, nawet jeśli pochodzą z różnych systemów. Używaj spójnych nazw jak access.login.succeeded lub data.customer.updated, aby ludzie mogli szybko przeglądać oś czasu.
Nie wszystko musi być audytowalne. Praktyczna zasada: loguj akcje, które zmieniają stan, zmieniają dostęp lub wywołują rezultaty biznesowe. Pomiń szum jak wyświetlenia stron, autosave’y i powtarzające się tła prób, chyba że są potrzebne do wyjaśnienia incydentu.
Uczyń typ aktora jawny, żeby „kto” nigdy nie był zgadywany. Element osi czasu powinien jasno mówić, czy akcję wykonał użytkownik, administrator, konto serwisowe czy automatyzacja.
Prosty zestaw grup zdarzeń na start:
- Dostęp: udane/nieudane logowanie, wylogowanie, zmiany MFA, reset hasła
- Dane: rekord utworzony/zaktualizowany/usunięty, masowe edycje, eksporty
- Workflow: zmiana statusu, zatwierdzenie/odrzucenie, przypisanie, naruszenie SLA
- Integracja: import zakończony/nieudany, otrzymany webhook, synchronizacja zewnętrzna
- Admin/bezpieczeństwo: zmiany ról, zmiany uprawnień, zdarzenia kluczy API
Jeśli aplikacja jest multi-tenant, dołącz identyfikator tenant-a do każdego zdarzenia. Również zapisz środowisko (prod, staging, dev), aby nigdy nie mieszać osi czasu przy dochodzeniach.
Minimalny model danych, który sprawia, że oś czasu jest czytelna
Oś czasu wydaje się zunifikowana tylko wtedy, gdy każdy wiersz odpowiada na te same podstawowe pytania. Jeśli każdy system loguje inaczej, dostaniesz przewijankę kryptycznych rekordów zamiast czytelnej historii.
Ustandaryzuj każde zdarzenie do jednego prostego kształtu. Możesz przechowywać dodatkowe szczegóły później, ale nagłówek osi czasu powinien być zawsze spójny.
Pięć pól, które muszą być obecne
To są minimalne pola, które sprawiają, że pojedynczy wiersz jest zrozumiały bez otwierania panelu szczegółów:
- event_id: unikalny, stabilny identyfikator, aby można było odwołać się do konkretnego zdarzenia
- timestamp: kiedy to się wydarzyło (najlepiej z milisekundami)
- actor: kto to zrobił (użytkownik, konto serwisowe, automatyzacja)
- action + target: co się stało i na czym (np. „updated” + „Invoice #1042”)
- outcome: sukces/porażka (i krótki kod powodu, jeśli nie powiodło się)
To samo w sobie czyni oś czasu czytelną. Dochodzenia zwykle dotyczą jednak łańcuchów zdarzeń, a nie pojedynczych wierszy.
Trzy ID, które łączą logi w historię
Dodaj kilka identyfikatorów, które pozwolą śledzić aktywność między ekranami, API i pracami w tle:
- correlation_id: jedna intencja użytkownika obejmująca wiele kroków (klik -> walidacja -> aktualizacja -> powiadomienie)
- session_id: wiąże zdarzenia z sesją logowania i pomaga wychwycić współdzielenie konta lub wzorce przejęcia
- request_id (or trace_id): łączy wywołania API i zadania w tle w ten sam ciąg pracy
Czas to ostatni „gotcha”. Przechowuj znaczniki czasu w UTC i zachowaj pole strefy czasowej (lub lokalizację aktora), aby UI mogło pokazywać czas lokalny, zachowując poprawne sortowanie.
Przykład: użytkownik klika „Approve refund”. Oś czasu może pokazać jedną widoczną akcję, podczas gdy correlation_id grupuje zatwierdzenie, zmianę statusu, e-mail do klienta i automatyczny krok payoutu w jedną, spójną nitkę.
Propozycja schematu: tabele i pola (praktyczne, nie idealne)
Jednolita oś czasu działa najlepiej, gdy zapisujesz jedno zdarzenie na moment w czasie, a szczegóły dopinasz do niego. Trzymaj główny wiersz mały i spójny, a szczegóły niech będą zmienne.
Tabele rdzeniowe
Cztery tabele pokrywają większość produktów:
- audit_event:
id,tenant_id,occurred_at,event_type(login, data_change, workflow),actor_id,target_type,target_id,summary,ip,user_agent,request_id,correlation_id,why_id(nullable) - audit_actor:
id,tenant_id,actor_type(user, api_key, system),user_id(nullable),display_name,role_snapshot(opcjonalne JSON) - audit_target (opcjonalne, jeśli chcesz wiele celów na zdarzenie):
event_id,target_type,target_id,label(np. „Invoice INV-1042”) - audit_change:
event_id,field_path(np.billing.address.city),old_value_json,new_value_json,value_type,redacted(bool)
Dla targetów najprostszy model to target_type + target_id na audit_event. Jeśli jedno zdarzenie dotyka wielu rekordów, dodaj audit_target i trzymaj główny cel w audit_event dla szybkiego filtrowania.
Dla wartości, przechowywanie po-polu w audit_change utrzymuje UI czytelnym i przeszukiwalnym. Jeśli potrzebujesz też pełnych snapshotów, możesz dodać old_record_json i new_record_json do audit_event, ale utrzymuj je opcjonalnymi, by kontrolować zużycie pamięci.
Pola dla workflow
Dla kroków workflow dodaj kolumny w audit_event (wypełniane tylko gdy event_type='workflow'): workflow_id, step_key, transition_key, from_status, to_status, result (success, blocked).
Indeksy, które utrzymają szybkość
Większość ekranów pyta „ostatnia aktywność dla tenant-a”, „wszystko o rekordzie” lub „wszystko przez osobę”. Indeksuj dla tych ścieżek:
(tenant_id, occurred_at desc)(tenant_id, target_type, target_id, occurred_at desc)(tenant_id, actor_id, occurred_at desc)- Na
audit_change:(event_id), oraz(field_path)jeśli filtrujesz po polu
Przechwytywanie „dlaczego”: powody, zatwierdzenia i kontekst
Oś czasu, która pokazuje jedynie „kto co, kiedy”, nadal zostawia najtrudniejsze pytanie bez odpowiedzi: dlaczego to zrobili? Bez jasnego „dlaczego” dochodzenia zamieniają się w zgadywanki i ludzie zaczynają gonić za wątkami czatu czy starymi zgłoszeniami.
Kody powodów lepsze niż wolny tekst (w większości przypadków)
Wolny tekst pomaga, ale jest chaotyczny. Ludzie piszą różne frazy dla tej samej przyczyny albo zapominają cokolwiek napisać. Krótki, spójny reason_code daje czyste filtrowanie, a opcjonalny reason_text dodaje ludzki szczegół, gdy to istotne.
Umieść oba na zdarzeniu (albo na przejściu workflow), aby każdy wpis mógł nieść kontekst:
reason_code(wymagany, gdy akcja zmienia dane lub status)reason_text(opcjonalny, krótki i poddawany przeglądowi)
Praktyczne podejście to zdefiniowanie 10–30 kodów powodów na obszar domenowy (billing, dostęp, zamówienia, wsparcie). Trzymaj je stabilne i dodawaj nowe powoli.
Zatwierdzenia i kontekst automatyzacji
„Dlaczego” często oznacza „ponieważ polityka tak nakazała” albo „ponieważ ktoś zatwierdził”. Przechowaj kontekst zatwierdzeń jako pola strukturalne, aby szybko odpowiadać na pytania bez otwierania innego systemu.
Dla każdego zdarzenia, które było zatwierdzone, zautomatyzowane lub wykonane w imieniu kogoś, zapisz te pola gdy są istotne:
approved_by_actor_idiapproved_atapproval_rule_id(lubpolicy_name) orazdecision(approved/denied)reference_id(ticket, case lub numer żądania zmiany)automation_rule_nameirule_versionautomation_inputs(bezpieczne, minimalne parametry np.threshold=5000)
Jedno ostrzeżenie: pola „dlaczego” to częste miejsce wycieków sekretów. Nie zapisuj haseł, kluczy API, pełnych tokenów sesji ani surowych danych płatniczych klientów w reason_text lub automation_inputs. Jeśli wartość jest wrażliwa, zapisz wersję zredagowaną (ostatnie 4 cyfry) lub wskaźnik jak token_present=true.
Przykład: limit zwrotów zostaje podniesiony. Oś czasu czyta „Limit zmieniony z 500 na 5000”, z reason_code=RISK_REVIEW, approved_by=Maria, policy=RefundLimitPolicy v3, reference_id=CASE-18422 i pustym automation_rule_name (ręcznie). Ten pojedynczy wpis wyjaśnia decyzję bez dodatkowego dochodzenia.
Układ UI: ekran, który szybko odpowiada na pytania
Dobra zunifikowana oś czasu działa jak strona wyników wyszukiwania, opowieść i paragon w jednym. Celem jest szybkość: powinieneś móc zauważyć, co się stało, w 10 sekund, a potem otworzyć jeden wiersz i otrzymać wystarczający kontekst do działania.
Prosty układ 3-panelowy
Umieść wszystko na jednym ekranie z trzema obszarami: panel filtrów po lewej, lista osi czasu na środku i wysuwany panel szczegółów po prawej. Lista pozostaje widoczna podczas przeglądania szczegółów, aby nigdy nie tracić miejsca.
Trzymaj filtry nieliczne, ale użyteczne. Zacznij od tych, które ludzie używają podczas incydentu lub rozmowy ze wsparciem:
- Zakres dat (z szybkimi presetami jak ostatnia godzina, ostatnie 24 godziny)
- Aktor (użytkownik, klucz API, system)
- Cel (rekord, typ obiektu, instancja workflow)
- Typ zdarzenia (logowanie, update, zatwierdzenie, eksport)
- Wynik (sukces, błąd, odrzucono)
Na liście centralnej każdy wiersz powinien odpowiadać na „kto co, kiedy i dlaczego” bez otwierania czegokolwiek. Uwzględnij znacznik czasu (ze strefą), nazwę aktora (i rolę jeśli istotna), czasownik akcji, etykietę celu i krótki fragment powodu, jeśli istnieje. Jeśli powodu brak, pokaż jasny placeholder rodzaju „Brak podanego powodu” zamiast zostawiać puste pole.
Panel szczegółów: potwierdź dowody
Widok szczegółów to miejsce, w którym budujesz zaufanie. Pokaż pełny kontekst: IP i urządzenie aktora dla logowań, dokładne pola zmienione z wartościami przed/po dla edycji danych oraz krok workflow, przypisanie i decyzję dla zatwierdzeń.
Dodaj kompaktowy pasek „Powiązane zdarzenia” nad payloadem, aby można było przeskakiwać do sąsiednich kroków jak „Zgłoszenie utworzone” -> „Manager zatwierdził” -> „Płatność nieudana”. Dołącz przełącznik surowego payloadu dla audytorów i inżynierów, ale domyślnie ukryj go.
Uczyń stany błędów oczywistymi. Użyj czytelnego stylu dla odrzuconych lub nieudanych wyników i pokaż wiadomość typu „Permission denied” lub „Validation failed”, aby użytkownicy nie musieli zgadywać.
Krok po kroku: jak zbudować to w realnym produkcie
Traktuj harmonogram audytu jak funkcję produktu, a nie stos logów. Jeśli support i compliance nie potrafią odpowiedzieć „kto co, kiedy i dlaczego” w mniej niż minutę, wymaga to poprawy.
Kolejność budowy, która działa w większości aplikacji:
- Najpierw zdefiniuj małą taksonomię zdarzeń i wymagane pola. Zdecyduj, co liczy się jako zdarzenie, i zablokuj pola obowiązkowe: aktor, czas, akcja, obiekt, wynik i correlation ID.
- Instrumentuj źródła, które już znają prawdę. Auth emituje logowania i zdarzenia tokenów, warstwy CRUD emitują create/update/delete z polami zmian, a silniki workflow emitują kroki i decyzje.
- Zapisuj zdarzenia do append-only magazynu audytu. Nie aktualizuj wierszy audytu. Waliduj restrykcyjnie przy zapisie (brakujący aktor, brak ID obiektu, nieprawidłowe znaczniki czasu), aby nie „naprawiać później” i nie tracić zaufania.
- Buduj odczyty zgodne z tym, jak ludzie prowadzą dochodzenia. Zwykle potrzebujesz trzech widoków: głównej osi czasu, panelu szczegółów zdarzenia oraz zapytań „powiązane zdarzenia” (ten sam correlation ID, ten sam obiekt, ten sam aktor, ta sama sesja).
- Dodaj dostęp oparty na rolach i testuj jak zespół supportu. Dane audytu często zawierają wrażliwe pola, więc filtruj wg ról i maskuj wartości tam, gdzie potrzebne.
Jeśli budujesz to w AppMaster, możesz zamodelować tabele audytu w Data Designer, emitować zdarzenia z Business Process Editor w punktach podejmowania decyzji i renderować oś czasu i szczegóły obok siebie w narzędziach UI.
Zanim uznasz to za ukończone, przeprowadź rzeczywisty scenariusz: manager zgłasza zmianę w zamówieniu. Support powinien móc zobaczyć dokładną zmianę pola, użytkownika i IP, krok workflow który to wywołał oraz podany powód (lub „brak”), bez przełączania ekranów.
Typowe błędy, które czynią oś czasu bezużyteczną
Jednolity harmonogram audytu działa tylko wtedy, gdy ludzie mu ufają i mogą szybko go czytać. Większość osi czasu zawodzi z przewidywalnych powodów.
Nadmierne logowanie to pierwszy problem. Jeśli każde wyświetlenie strony, hover i autosave trafia jako zdarzenie, ważne momenty giną w hałasie. Trzymaj oś czasu skoncentrowaną na akcjach, które zmieniają dostęp, dane lub wyniki. Jeśli potrzebujesz wysokowolumenowych logów technicznych, trzymaj je osobno i łącz je wewnętrznie przez ID zdarzenia.
Niedostateczne logowanie jest równie złe. Wpis „Record updated” bez aktora, celu czy jasnego wyniku nikomu nie pomaga. Każde zdarzenie powinno zawierać kto to zrobił, na czym to zrobił, kiedy to miało miejsce i co się zmieniło. Jeśli produkt wymaga powodu (lub zatwierdzenia), zapisz ten kontekst na zdarzeniu, nie w oddzielnym systemie, do którego ludzie nie mają dostępu przy dochodzeniu.
Modyfikowalne logi niszczą zaufanie. Jeśli admini mogą edytować lub usuwać zdarzenia audytu, to już nie jest ślad audytu, tylko notatki. Traktuj zdarzenia audytu jako append-only. Jeśli coś zostało zapisane błędnie, zapisz korekcyjne zdarzenie, które wyjaśnia poprawkę.
Niespójne czasowniki utrudniają filtrowanie i przeglądanie. „Updated”, „changed” i „edited” nie powinny być trzema różnymi typami zdarzeń dla tej samej akcji. Wybierz mały zestaw czasowników i trzymaj się go, np.: created, updated, deleted, approved, rejected, logged_in, permission_changed.
Na koniec, nie ujawniaj wrażliwych danych. Surowe dify często zawierają hasła, tokeny, dane osobowe czy płatnicze. Przechowuj tylko to, co potrzebne, maskuj pola wrażliwe i ograniczaj, kto może widzieć pewne szczegóły zdarzeń. Na przykład pokaż „Numer telefonu zmieniony”, ale ukryj stare i nowe wartości, chyba że widz ma specjalne uprawnienie.
Szybka lista kontrolna przed wdrożeniem
Testuj oś czasu jak support i przegląd bezpieczeństwa. Wybierz jeden wrażliwy rekord (np. ustawienie wypłat klienta) i spróbuj wyjaśnić, co się stało, używając tylko ekranu z osią czasu.
Pytania do weryfikacji:
- Czy zawsze potrafisz wskazać aktora? Dla wrażliwych rekordów pokaż „wykonane przez” (użytkownik, konto serwisowe lub system), plus rolę i metodę uwierzytelnienia (hasło, SSO, klucz API).
- Czy możesz udowodnić, co się zmieniło? Dla kluczowych pól pokaż wartości przed i po, nie tylko „updated”. Jeśli wartość jest zbyt wrażliwa, pokaż zmaskowaną wersję oraz hash, aby udowodnić, że zmiana zaszła.
- Czy potrafisz śledzić jedną akcję end-to-end? Upewnij się, że
correlation_idłączy logowanie, akcję UI, kroki workflow i zapisy w bazie w jedną nitkę. - Czy support szybko znajdzie właściwe zdarzenie? Potwierdź, że filtry działają dla aktora, celu (typ rekordu i ID), zakresu czasu i wyników (sukces, błąd, odrzucono).
- Czy dostęp do audytu jest kontrolowany i czy eksporty są widoczne? Ogranicz, kto może przeglądać i eksportować dane audytu, i loguj każdy widok/eksport jako oddzielne zdarzenie (kto, kiedy, co wyeksportowano).
Prosty test końcowy: daj oś czasu komuś, kto jej nie budował i zapytaj „Dlaczego ten rekord zmienił się o 15:12?” Jeśli nie potrafi odpowiedzieć w 60 sekund, prawdopodobnie potrzebujesz więcej pól kontekstowych (powód, request ID, zatwierdzenie lub szczegóły błędu).
Przykład: zbadanie podejrzanej zmiany w kilka minut
Menedżer supportu pisze: „Rekord klienta Acme Corp wygląda źle. Ich e-mail rozliczeniowy się zmienił, a klient twierdzi, że nikt z ich zespołu tego nie zrobił.” Otwierasz jednolitą oś czasu audytu i szukasz ID klienta.
Oś czasu pokazuje jasny łańcuch, ponieważ wszystkie powiązane zdarzenia dzielą ten sam correlation_id.
Na początku widzisz logowanie: Sam (sprzedawca) zalogował się o 09:12 z nowego urządzenia i nietypowej lokalizacji. Blok sesji zawiera IP, user agent i status MFA. Dwie minuty później widać „View customer record”, a potem „Edit customer record”.
Zdarzenie aktualizacji rekordu jest łatwe do odczytania. Wypisuje dokładne zmiany pól (billing email z starego na nowy) oraz źródło (web app). Pod nim pojawia się „dlaczego” jako kod powodu: Customer requested update, ale notatka jest pusta.
Następnie wpisy workflow wyjaśniają, co się stało po edycji. Uruchomiła się reguła automatyczna: „Jeśli zmienia się billing email, powiadom finanse i wymuś zatwierdzenie.” Oś czasu pokazuje krok zatwierdzenia w oczekiwaniu, a na końcu zatwierdzenie przez Dana (team lead) o 09:18 z krótką notatką: „Approved per ticket #4812.”
Support może rozwiązać sprawę bez zgadywania:
- Zweryfikuj aktora: logowanie Sama wygląda podejrzanie (nowe urządzenie, brak notatki), więc potwierdzasz, czy Sam był właścicielem sesji.
- Potwierdź intencję: notatka zatwierdzającego wskazuje na ticket; jeśli ticket nie istnieje, to czerwony sygnał.
- Cofnij bezpiecznie: utwórz zdarzenie korygujące, które przywraca stary e-mail, z wymaganym powodem „Reverted due to suspected account misuse.”
- Udokumentuj wynik: dodaj notatkę sprawy powiązaną z tym samym
correlation_id, aby przyszli czytelnicy zobaczyli pełną historię.
Kolejne kroki: wdrażaj bezpiecznie i utrzymuj to w porządku
Jednolita oś czasu audytu jest użyteczna tylko wtedy, gdy ludzie jej ufają. Traktuj pierwsze wydanie jak system bezpieczeństwa, nie ładny ekran.
Ustal jasne cele dotyczące retencji, szybkości wyszukiwania i kosztów. Wiele zespołów stosuje prosty podział: 90 dni "hot" (szybkie), 1–2 lata "warm" (wolniejsze) i dłuższe archiwa.
Zdefiniuj wcześniej, co znaczy „szybko”. Jeśli oś czasu powinna otwierać się w mniej niż 2 sekundy dla typowego rekordu, zaplanuj to: indeksuj po (target_type, target_id, occurred_at), trzymaj payloady małe i archiwizuj stare wiersze zamiast pozwalać tabeli rosnąć bez końca.
Wdrażaj małymi krokami, aby widok pozostał czytelny, a dane spójne:
- Zaprojektuj prototyp UI osi czasu z 5–8 typami zdarzeń, które pokrywają realne dochodzenia.
- Dodaj reguły retencji i archiwizacji zanim zwiększysz wolumen zdarzeń.
- Dodaj podstawowe wyszukiwanie i filtry (aktor, zakres dat, typ zdarzenia).
- Waliduj na prawdziwych przypadkach: „Czy support może odpowiedzieć, kto to zmienił i dlaczego?”
- Rozszerzaj typy zdarzeń dopiero po zaufaniu do widoku podstawowego.
Eksporty i raportowanie kusi, ale potęgują błędy. Poczekaj, aż ekran będzie niezawodny, a nazwy zdarzeń i kontekst stabilne. Potem dodaj eksporty zgodne z zasadami dostępu i zawierające jasną strefę czasową, użyte filtry i identyfikator niepodrabialności (np. export ID).
Zaplanuj role wcześnie, bo dane audytu często zawierają wrażliwe szczegóły:
- Wyświetlanie osi czasu (większość person pracujących z rekordem)
- Eksport (ograniczone do leadów lub compliance)
- Wyświetlanie surowego payloadu (security, engineering lub admini)
- Zarządzanie polityką retencji (tylko admini)
Jeśli budujesz to w AppMaster, podejście czyste to odwzorować schemat w Data Designer, a następnie emitować zdarzenia osi czasu z Business Processes tam, gdzie już egzekwujesz reguły (zatwierdzenia, zmiany statusu, edycje). To pomaga utrzymać „kto co, kiedy i dlaczego” spójnym na web i mobile oraz łatwiej utrzymać to w miarę ewolucji workflowów.
FAQ
Zunifikowana oś czasu audytu to jednolity, chronologiczny strumień ważnych zdarzeń w produkcie. Przyspiesza dochodzenia, ponieważ widzisz kto co zrobił, kiedy, gdzie i dlaczego bez przełączania się między logami uwierzytelniania, historią bazy danych i narzędziami workflow.
Domyślnie loguj akcje, które zmieniają stan, zmieniają dostęp lub wywołują efekt biznesowy. Zazwyczaj to logowania/sesje, operacje create/update/delete, przejścia w workflow (zatwierdzenia i zmiany statusu) oraz zmiany administracyjne i bezpieczeństwa, jak role i klucze API.
Utrzymuj jeden spójny kształt zdarzenia: event_id, timestamp, actor, action + target oraz outcome. Dodaj identyfikatory takie jak correlation_id, session_id i request_id, aby móc prześledzić jedną akcję end-to-end między UI, API i zadaniami w tle.
Używaj stabilnych, spójnych nazw opisujących intencję, a nie implementację. Mała taksonomia jak access.login.succeeded czy data.customer.updated pomaga szybko przeglądać i filtrować bez uczenia się szczegółów każdego podsystemu.
Przechowuj znaczniki czasu w UTC dla prawidłowego sortowania i spójności, a do konwersji na lokalny czas używaj UI. Dobrze też zachować pole strefy czasowej (lub lokalizację aktora), aby czytający rozumieli wyświetlany czas bez utraty porządku.
Przechwytuj „dlaczego” jako dane strukturalne: wymagany reason_code dla znaczących zmian oraz opcjonalny krótki reason_text gdy potrzeba. Jeśli zaangażowane są zatwierdzenia lub polityki, zapisz kto zatwierdził, czas decyzji i referencyjny identyfikator, aby wpis był samowystarczalny.
Domyślnie traktuj logi jako append-only: nigdy nie edytuj ani nie usuwaj zdarzeń audytu. Jeśli coś trzeba poprawić, zapisz nowe zdarzenie korygujące, które odwołuje się do oryginalnego event_id, tak aby czytelnicy widzieli, co się zmieniło i dlaczego dokonano korekty.
Zacznij od prostego układu trzykolumnowego: filtry po lewej, lista osi czasu w środku i panel szczegółów po prawej. Lista powinna odpowiadać na „kto/co/kiedy/dlaczego” na pierwszy rzut oka, a widok szczegółów pokazywać dowody jak IP, urządzenie i wartości przed/po.
Nadmiarowe logowanie ukrywa ważne momenty w szumie, natomiast niedostateczne logowanie tworzy niejasne wpisy jak „Record updated” bez aktora czy zmian pól. Inne typowe błędy to niespójne czasowniki, brak correlation_id oraz wycieki wrażliwych danych w diffach czy polach powodu.
W AppMaster zamodeluj tabele audytu w Data Designer, emituj zdarzenia z Business Process Editor w kluczowych punktach decyzyjnych i zbuduj UI osi czasu za pomocą narzędzi web/mobile. Jednolity format zdarzeń jest szczególnie przydatny, gdy akcje UI, logika backend i integracje mogą zapisywać w tej samej strukturze.


