Pracuję z krytycznymi dla bezpieczeństwa systemami czasu rzeczywistego, a logowanie jest często jedynym sposobem na złapanie rzadkich błędów, które pojawiają się raz niebieski księżyc w każdy 53 wtorek, gdy jest pełnia, jeśli złapiesz mój dryf. Ten rodzaj powoduje, że masz obsesję na punkcie tego tematu, więc przepraszam teraz, jeśli zacznę pienić się w usta. Poniższe napisano dla dzienników debugowania kodu natywnego, ale większość z nich dotyczy również zarządzanego świata ...
Użyj plików dziennika tekstowego. Wydaje się to oczywiste, ale niektórzy próbują generować binarne pliki dziennika: to po prostu głupie, ponieważ nie muszę szukać narzędzia czytającego, gdy jestem w terenie. Plus, jeśli jest to tekst, a debugowanie jest pełne, istnieje duża szansa, że inżynier terenowy może odczytać plik i zdiagnozować problem, nie wracając do mnie. Wszyscy wygrywają.
Projektuję systemy, które są w stanie zarejestrować prawie wszystko, ale domyślnie nie włączam wszystkiego. Informacje debugowania są wysyłane do ukrytego okna dialogowego debugowania, które sygnalizuje je znacznikiem czasowym i wysyła do pola listy (ograniczone do około 500 linii przed usunięciem), a okno dialogowe pozwala mi je zatrzymać, automatycznie zapisać w pliku dziennika lub przekierować do dołączony debugger. To przekierowanie pozwala mi zobaczyć, jak dane wyjściowe debugowania z wielu aplikacji są porządnie zserializowane, co może czasem uratować życie. I wykorzystywane do korzystania numerycznych poziomów rejestrowania (wyższa ustawić poziom, tym więcej można uchwycić):
off
errors only
basic
detailed
everything
ale jest to zbyt mało elastyczne - gdy zmierzasz w stronę błędu, bardziej efektywne jest skupienie się na logowaniu dokładnie na tym, czego potrzebujesz, bez konieczności przechodzenia przez mnóstwo detrytusu, i może to być jeden szczególny rodzaj transakcji lub operacji to powoduje błąd. Jeśli wymaga to włączenia wszystkiego, po prostu utrudniasz sobie pracę. Potrzebujesz czegoś drobniejszego.
Teraz przechodzę do logowania w oparciu o system flag. Wszystko, co jest rejestrowane, ma flagę opisującą rodzaj operacji, a zestaw pól wyboru pozwala mi zdefiniować, co zostanie zarejestrowane. Zazwyczaj ta lista wygląda następująco:
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
Ten system rejestrowania jest dostarczany z wersją kompilacji wersji , domyślnie włączoną i zapisującą do pliku. Jest za późno, aby dowiedzieć się, że powinieneś się logować PO wystąpieniu błędu, jeśli błąd występuje tylko raz na sześć miesięcy i nie możesz go odtworzyć. Rejestrowanie, które działa tylko z kompilacjami debugowania, jest po prostu. Równina. głupi.
Oprogramowanie zazwyczaj jest dostarczane z włączonymi BŁĘDAMI, PODSTAWOWYMI, STANEM_ZMIANY i WYJĄTKIEM, ale można to zmienić w terenie za pomocą okna dialogowego debugowania (lub ustawienia rejestru / ini / cfg, w którym te rzeczy są zapisywane).
No i jedno - mój system debugowania generuje jeden plik dziennie. Twoje wymagania mogą być inne. Ale upewnij się, że kod debugowania rozpoczyna każdy plik od daty, wersji uruchomionego kodu i, jeśli to możliwe, jakiegoś znacznika identyfikatora klienta, lokalizacji systemu lub cokolwiek innego. Możesz dostać miszmasz plików dziennika przychodzących z pola i potrzebujesz trochę informacji o tym, skąd pochodzą i jaka wersja systemu, na którym działali, która jest w samych danych, i nie możesz ufać klientowi / inżynier terenowy, który powie ci, którą wersję ma - może po prostu powiedzieć, którą wersję MYŚLĄ, którą mają. Co gorsza, mogą zgłaszać wersję exe, która znajduje się na dysku, ale stara wersja nadal działa, ponieważ zapomniały zrestartować się po wymianie. Niech Twój kod powie ci sam.
Wreszcie, nie chcesz, aby Twój kod generował własne problemy, więc włącz funkcję timera, aby wyczyścić pliki dziennika po tylu dniach lub tygodniach (po prostu sprawdź różnicę między czasem teraz a czasem utworzenia pliku). Jest to OK w przypadku aplikacji serwerowej, która działa cały czas, w aplikacji po stronie klienta możesz uzyskać usunięcie starych danych podczas uruchamiania. Zwykle oczyszczamy się po około 30 dniach, w systemie bez częstych wizyt inżyniera możesz chcieć zostawić go na dłużej. Oczywiście zależy to również od rozmiaru plików dziennika.