Najlepsze praktyki dotyczące rejestrowania działań użytkownika podczas produkcji

22

Planowałem rejestrować wiele różnych rzeczy w moim środowisku produkcyjnym, na przykład gdy użytkownik:

  • Wyloguj się, wyloguj się
  • Zmień profil
  • Edytuj ustawienia konta
  • Zmień hasło ... itp

Czy to dobra praktyka dla środowiska produkcyjnego? Co też jest dobrym sposobem na rejestrowanie tego wszystkiego. Obecnie używam następującego bloku kodu, aby zalogować się do:

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

Czy będzie to w porządku dla produkcji? Moja aplikacja jest bardzo nowa, więc nie oczekuję od milionów użytkowników ani niczego innego, szukając najlepszych praktyk w śledzeniu działań na stronie lub nawet najlepszych praktyk.


źródło
1
Prawdopodobnie sugerowałbym Databasenad plikiem tekstowym ...
@DaveZych: zależy od celu logowania. Jeśli śledzenie / śledzenie błędów jest jakąkolwiek częścią tego celu, baza danych jest niedostępna. Zobacz programmers.stackexchange.com/questions/92186/…
Marjan Venema,
Zrobiłem podstawowe wdrożenie a User Activity Logger that hooks up various events, można go zobaczyć tutaj: stackoverflow.com/questions/30326673/... . Cieszyć się!
Jeremy Thompson

Odpowiedzi:

30

To nie jest bezpośrednia odpowiedź na pytanie, a raczej rozwinięcie go.

Po uruchomieniu nowej aplikacji zalecamy rejestrowanie wszystkiego, co robi użytkownik: zaloguj się, wyloguj, zarysuje ich **, wszystko. Jeśli jest oparty na sieci, rozważ użycie map cieplnych, aby wiedzieć, co robiła ich mysz.

Kiedy pod koniec lat 70. pracowałem nad projektem BravoX w firmie Xerox, nagrywaliśmy ruchy myszy piksel po pikselu, aby dowiedzieć się, w jaki sposób użytkownicy mogą korzystać z tej dziwnej rzeczy zwanej edytorem WYSIWYG. Podczas lunchu oglądaliśmy odtworzenia sesji użytkowników. To było bardzo pouczające. Odkryliśmy wzór użycia, który nazwaliśmy Charlie Browning - użytkownik zaznaczał tekst i zapisywał go kursywą ... potem cofał ... następnie powtarzał ... tam iz powrotem, tam iz powrotem. Okazuje się, że próbowali zrozumieć te rzeczy na poziomie emocjonalnym. Więc my (Greg Kusnik wykonaliśmy kod, jeśli pamięć służy), wprowadziliśmy pewne specyficzne optymalizacje, aby wesprzeć dokładnie to zachowanie.

Bez nagrania nigdy byśmy tego nie pomyśleli.

Peter Rowell
źródło
1
Możesz napisać książkę poświęconą samemu temu komentarzowi!
biskup
Ten szczególny rodzaj rejestrowania dotyczył doświadczenia użytkownika w czasie rzeczywistym, więc nie byłbym autorem. Byłem panem Hardcopy. Po naciśnięciu przycisku Drukuj wziąłem wewnętrzną reprezentację dokumentu, przekonwertowałem go na język opisu strony, a następnie przesłałem go przez tę dziwną rzecz zwaną Ethernet do pierwszych na świecie drukarek laserowych, które znajdowały się tuż za korytarzem. Grupy, z którymi najbardziej współdziałałem, to Departament Typografii Senatu USA i grupa drukująca MFW, 2 nasze najlepsze, najbardziej wymagające strony z testami wersji beta. Nauczyłem się dużo o tych facetów z układu, czcionek itp. Dobre czasy.
Peter Rowell
9

Gdybym był tobą i trzymałem się pisania do pliku tekstowego, użyłbym log4net i zalogowałbym się w określonym pliku „UserActions.log”. W ten sposób nie zaburza to normalnego logowania. Korzystając z log4net (lub innego frameworka rejestrowania), możesz uniknąć ponownego wynalezienia koła i wykorzystania dołączających się plików dołączających pliki, ostrzeżeń / błędów / kodów debugowania / informacji, pisania plików wsadowych itp. Zawsze dobrym pomysłem jest wbudowanie się w dobre logowanie dowolna aplikacja na poziomie produkcji.

W rzeczywistości jednak prawdopodobnie lepiej przechowywać wszystkie te informacje w bazie danych. Korzystanie z bazy danych pozwoli ci ją posortować, agregować i łatwiej tworzyć statystyki

zawiesza się
źródło
3
Możesz zjeść swoje ciasto i zjeść: istnieje DatabaseAppender dla log4net: Logowanie.apache.org/log4net/release/config-examples.html . Ale jeśli obawiasz się o wydajność, możesz również zalogować się do plików i parsować je w osobnych usługach, przygotowując dane do szybszego raportowania (którym może być baza danych raportów).
Grimace of Despair
9

Pliki dziennika są używane 1. w celu uzyskania informacji o debugowaniu błędów systemu. 2. zbadać działania użytkowników pod kątem psot lub 3. zrozumieć, w jaki sposób ludzie korzystają z systemu, gdy nie można ich oglądać. Pamiętając o tym:

  • Zaloguj środowisko (np. Zmienne środowiskowe, inne ustawienia itp.) Podczas uruchamiania aplikacji. Jest to pomocne w przypadku problemów z debugowaniem.
  • Zaloguj użytkownika i akcję (odrębną część adresu URL) dla każdego żądania.
  • Zapisz wszystkie parametry dla każdego żądania Z WYJĄTKIEM haseł. Lubię umieszczać ograniczniki wokół każdego parametru w dziennikach, np phone{(999)999-9999} email{[email protected]}. Hasła nigdy nie należy zapisywać nigdzie indziej niż do bazy danych w jeden sposób, kryptograficznie bezpieczna funkcja skrótu z unikalną solą dla każdego użytkownika i wieloma rundami mieszania (patrz przypis)
  • Podczas logowania powinieneś zalogować adres IP użytkownika, identyfikator użytkownika, nazwę, liczbę nieudanych prób logowania, być może przeglądarkę, może identyfikator sesji ciasteczka, ale nigdy hasło.
  • Pamiętaj, aby nie logować hasła na stronie logowania ORAZ stronie zmiany hasła, ani nie powinieneś logować tajnego pytania ani odpowiedzi, jeśli masz taką funkcjonalność. Wszelkie inne hasła lub klucze szyfrowania nie mogą być rejestrowane. Dobrą praktyką jest zapisywanie w logu czegoś takiego jak sześć gwiazdek dla tych parametrów, abyś mógł zobaczyć, że pamiętasz, aby ukryć te dane.
  • Lubię rejestrować całkowity czas potrzebny na obsłużenie każdego żądania: Done: 49ms
  • Lubię rejestrować zmiany do stanu sesji. Powinny być rzadkie.
  • Jak powiedzieli inni, istnieją świetne biblioteki rejestrujące do logowania do plików, a nie do końca do logowania do baz danych.
  • Bezpiecznie przechowuj dzienniki. Nawet bez haseł istnieją przepisy stanowe, federalne i międzynarodowe dotyczące danych osobowych (patrz Safe Harbor ), które czynią dane dziennika poufnymi.
  • Rób kopie zapasowe. Jeśli pozwolisz im co wieczór tworzyć kopię zapasową na pełnym dysku, pamiętaj, aby przed aktualizacją na nowy serwer wykonać ich kopię zapasową w innym miejscu (nie pytaj mnie, jak się tego nauczyłem).

Inne wskazówki

Przypis: Aby się zalogować, zaszyfruj dostarczone hasło tym samym algorytmem mieszania i sól z oryginalnego skrótu dla tego użytkownika. Jeśli skrót dostarczonego hasła jest zgodny z hasłem przechowywanym w bazie danych, są one zalogowane. Aby to zadziałało, musisz zdefiniować zestaw znaków dla swojego hasła, nie zezwalać na znak podstawienia Unicode i inne znaki spoza zestawu.

GlenPeterson
źródło
2

Nie określasz, czy korzystasz z bazy danych, ale jeśli tak, a ta baza danych to SQL Server, możesz dodać coś o nazwie AutoAudit i automatycznie rejestrować wszystkie interakcje z Twoimi danymi. Pamiętaj tylko, aby podać tylko te obiekty, które chcesz skontrolować.

Ale tak czy inaczej, nie próbowałbym ręcznie kodować mojego śledzenia, ponieważ skończy się to koszmarem konserwacji.

Ponadto do rejestrowania nie rzucaj własnym, użyj rejestrowania biblioteki korporacyjnej lub Log4Net lub podobnego.

Richard
źródło
2

Tylko ogólna rada. Nie może być bezpośrednio związane z twoim pytaniem.

To zależy od tego, do czego zamierzasz używać dzienników? W produkcji wykorzystywane są głównie dzienniki do wykrywania operacji powodujących błędy. Jeśli przechowujesz je w celu śledzenia działań użytkownika, nie jest to częścią dziennika. To musi być funkcja produktu po stronie serwera. Te rzeczy zdecydowanie muszą przejść do bazy danych w celu późniejszego zbadania. Ale dzienniki po stronie serwera, takie jak: „Wystąpił błąd, ponieważ tekst jest pusty”, nie jest częścią tej funkcji. Te rzeczy muszą iść w systemie plików. Muszą mieć przy sobie następującą treść: - identyfikator_użytkownika, numer_błędu, tekst_błędu, nazwa_pliku, nazwa_funkcji, identyfikator_wątku, czas_daty_systemowej i dowolny inny kontekst.

Teraz mówię tylko o dziennikach w plikach.

1) Zachowaj je asynchronicznie. Operacja we / wy jest kosztowna.

2) Zaprojektuj je jako klasę niż funkcję. Przyszłe zmiany będą łatwe.

3) Jeśli to możliwe, utrzymuj je pojedynczo. Singleton jest trudny w wielu wątkach, więc projektuj poprawnie.

4) Również lepiej, aby interakcja między rejestratorem a loggee była prosta. Przez większość czasu wysyłaj numer_wiadomości niż tekst_tekstu i pozwól loggerowi pobrać wiadomość z numeru. Pomoże to, jeśli później chcemy wprowadzić zmiany w ogólnych formatach dziennika.

Zwykle logger, a także rzeczy, które musimy rejestrować, powinny być częścią projektu. Widziałem przypadki, w których nastąpiły zmiany w projekcie, aby upewnić się, że wszystkie istotne informacje są poprawnie rejestrowane.

Manoj R.
źródło
1

Spróbuj Log4Net. Pozwala zalogować się do plików lub bazy danych. Oto samouczek !

Używamy Log4Net we wszystkich naszych projektach.

Bittech
źródło
0

Korzystanie z pliku dziennika przedstawia kilka problemów. Po pierwsze, mogą pojawić się błędy, gdy wiele procesów próbuje uzyskać dostęp do pliku. Możesz również napotkać problemy podczas próby zmiany lub usunięcia pliku podczas działania systemu. Rozwiązaniem jest korzystanie z bazy danych.

Zatem krok 1 polega na utworzeniu tabeli bazy danych. Proponuję następujące pola:
* userID
* akcja (np. Logowanie, usuwanie foo)
* Trochę tekstu opisowego (tutaj dozwolone null)
* znacznik czasu

Krok 2: Utwórz procedurę składowaną z danymi wejściowymi dla ID użytkownika, akcji i tekstu opisowego. Użyj aktualnego czasu, aby utworzyć znacznik czasu.

Krok 3: Napisz metodę rejestrowania w wygodnej udostępnionej bibliotece, aby łatwo było ją włączyć wszędzie i przećwiczyć wywoływanie tej metody zgodnie z wymaganiami. Możesz także chcieć mieć logikę flagi poziomu rejestrowania, aby zmienić to, co jest rejestrowane.

Krok 4: Utwórz procedurę konserwacji, aby od czasu do czasu usuwać stare wiadomości z tabeli rejestrowania. Być może usuń, gdy starsze niż X, uruchamiaj co tydzień w ramach regularnej konserwacji bazy danych (przebudowa indeksu itp.).

Po zbudowaniu tego raz powinieneś być w stanie użyć kodu zaangażowanego w inne projekty.

Adam F.
źródło