it-swarm.com.de

Best Practices für die Protokollierung von Benutzeraktionen in der Produktion

Ich hatte vor, viele verschiedene Dinge in meiner Produktionsumgebung zu protokollieren, z. B. wenn ein Benutzer:

  • Anmelden, Abmelden
  • Profil ändern
  • Kontoeinstellungen bearbeiten
  • Passwort ändern ... etc.

Ist dies eine gute Vorgehensweise für eine Produktionsumgebung? Auch was ist ein guter Weg, um all dies zu protokollieren. Ich verwende derzeit den folgenden Codeblock, um mich anzumelden:

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();
            }
        }

Wird das für die Produktion in Ordnung sein? Meine Anwendung ist sehr neu, daher erwarte ich nicht sofort Millionen von Benutzern oder ähnliches und suche nach den besten Methoden, um die Aktionen auf einer Website zu verfolgen, oder ob dies sogar die beste Vorgehensweise ist.

22
anthonypliu

Dies ist keine direkte Antwort auf die Frage, sondern eher eine Erweiterung.

Wenn Sie eine neue App starten, empfehle ich, alles zu protokollieren , was der Benutzer tut: Anmelden, Abmelden, A ** kratzen, alles. Wenn es webbasiert ist, sollten Sie Heatmaps verwenden, damit Sie wissen, was die Maus tat.

Als ich in den späten 70ern bei Xerox auf dem BravoX-Projekt war, haben wir pixelweise Mausbewegungen aufgezeichnet, um herauszufinden, wie Benutzer dieses seltsame Ding namens WYSIWYG-Editor verwenden könnten. Wir würden uns die Wiedergabe von Benutzersitzungen während des Mittagessens ansehen. Es war extrem lehrreich. Wir entdeckten ein Verwendungsmuster, das wir Charlie Browning nannten - der Benutzer wählte einen Text aus und machte ihn kursiv ... dann machten sie rückgängig ... dann machten sie ... hin und her, hin und her. Es stellte sich heraus, dass sie versuchten, dieses Zeug auf emotionaler Ebene zu verstehen. Also haben wir (Greg Kusnik hat den Code gemacht, wenn Speicher dient) einige spezifische Optimierungen vorgenommen, um genau dieses Verhalten zu unterstützen.

Ohne die Aufnahme hätten wir nie daran gedacht.

30
Peter Rowell

Wenn ich Sie wäre und beim Schreiben in eine Textdatei bleiben würde, würde ich log4net verwenden und mich in eine bestimmte "UserActions.log" -Datei einloggen. Auf diese Weise wird Ihre normale Protokollierung nicht durcheinander gebracht. Durch die Verwendung von log4net (oder eines anderen Protokollierungsframeworks) können Sie vermeiden, das Rad neu zu erfinden und rollende Dateiappender, Warn-/Fehler-/Debug-/Infocodes, Batch-Dateischreiben usw. zu nutzen. Es ist immer eine gute Idee, eine gute Anmeldung einzubauen jede Anwendung auf Produktionsebene.

In der Realität ist es jedoch wahrscheinlich besser, alle diese Informationen in einer Datenbank zu speichern. Wenn Sie eine Datenbank verwenden, können Sie sie sortieren, aggregieren und Statistiken erstellen

9
devshorts

Protokolldateien werden verwendet, 1. um Informationen zum Debuggen von Systemfehlern abzurufen. 2. um Benutzeraktivitäten auf Unfug zu untersuchen oder 3. um zu verstehen, wie Benutzer das System verwenden, wenn Sie sie nicht sehen können. In diesem Sinne:

  • Protokollieren Sie die Umgebung (z. B. Umgebungsvariablen, andere Einstellungen usw.) beim Start der Anwendung. Dies ist hilfreich beim Debuggen von Problemen.
  • Protokollieren Sie den Benutzer und die Aktion (den eindeutigen Teil der URL) für jede Anforderung.
  • Protokollieren Sie alle Parameter für jede Anforderung [~ # ~] außer [~ # ~] für Kennwörter. Ich möchte Trennzeichen um jeden Parameter in den Protokollen setzen, z. phone{(999)999-9999} email{[email protected]}. Passwörter sollten niemals geschrieben werden überall außer in der Datenbank in einer einzigen, kryptografisch sicheren Hash-Funktion mit eindeutigem Salt für jeden Benutzer und mehreren Hashing-Runden (siehe Fußnote)
  • Wenn Sie sich anmelden, sollten Sie die IP-Adresse, die Benutzer-ID, den Namen, die Anzahl der fehlgeschlagenen Anmeldungen des Benutzers, möglicherweise den Browser, möglicherweise die ID der Cookie-Sitzung, aber niemals das Kennwort protokollieren.
  • Denken Sie daran, das Kennwort nicht auf der Anmeldeseite [~ # ~] und [~ # ~] der Seite zum Ändern des Kennworts zu protokollieren und die geheime Frage oder Antwort nicht zu protokollieren, wenn Sie über diese Funktionalität verfügen . Andere Passwörter oder Verschlüsselungsschlüssel dürfen nicht protokolliert werden. Es wird empfohlen, für diese Parameter etwa sechs Sterne in das Protokoll zu schreiben, damit Sie sehen können, dass Sie daran gedacht haben, diese Daten zu unterdrücken.
  • Ich möchte die Gesamtzeit protokollieren, die benötigt wird, um jede Anfrage zu bearbeiten: Done: 49ms
  • Ich möchte Änderungen am Sitzungsstatus protokollieren. Diese sollten selten sein.
  • Wie andere bereits sagten, gibt es großartige Protokollierungsbibliotheken für die Protokollierung in Dateien, bei denen die Protokollierung in Datenbanken nicht sicher ist.
  • Speichern Sie Protokolle sicher. Auch ohne Passwörter gibt es staatliche, bundesstaatliche und internationale Gesetze zu personenbezogenen Daten (siehe Safe Harbor ), die Protokolldaten vertraulich machen.
  • Nehmen Sie Backups. Wenn Sie sie jede Nacht in ein Backup mit vollem Laufwerk einfließen lassen, denken Sie daran, sie an einem anderen Ort zu sichern, bevor Sie auf einen neuen Server aktualisieren (fragen Sie mich nicht, wie ich das gelernt habe).

Andere Tipps

Fußnote: Um jemanden anzumelden, hashen Sie das angegebene Passwort mit demselben Hashing-Algorithmus und das Salz aus dem ursprünglichen Hash für diesen Benutzer. Wenn der Hash des angegebenen Kennworts mit dem in der Datenbank gespeicherten Kennwort-Hash übereinstimmt, werden sie angemeldet. Damit dies funktioniert, müssen Sie den Zeichensatz für Ihr Kennwort definieren, das Unicode-Ersetzungszeichen und alle anderen Zeichen außerhalb Ihres Satzes nicht zulassen.

9
GlenPeterson

Sie geben nicht an, ob Sie eine Datenbank verwenden, aber wenn dies der Fall ist und diese Datenbank SQL Server ist, können Sie AutoAudit hinzufügen und alle Interaktionen mit Ihren Daten automatisch protokollieren. Stellen Sie einfach sicher, dass Sie nur die Objekte angeben, die überwacht werden sollen.

Trotzdem würde ich nicht versuchen, mein Tracking manuell zu codieren, da dies zu einem Alptraum für die Wartung führen wird.

Verwenden Sie für die Protokollierung auch keine eigenen, verwenden Sie Enterprise Library Logging oder Log4Net oder ähnliches.

2
Richard

Nur ein allgemeiner Rat. Möglicherweise nicht direkt mit Ihrer Frage verbunden.

Es hängt davon ab, wofür Sie Protokolle verwenden werden. In der Produktion werden meistens Protokolle verwendet, um die Vorgänge zu erkennen, die die Fehler verursachen. Wenn Sie sie zur Verfolgung der Benutzeraktionen aufbewahren, ist dies nicht Teil des Protokolls. Dies muss die serverseitige Funktion des Produkts sein. Diese Dinge müssen dann definitiv für ein späteres Studium in die Datenbank aufgenommen werden. Die serverseitigen Protokolle wie "Fehler aufgetreten, da Text leer ist" sind jedoch nicht Teil der Funktion. Diese Dinge müssen in das Dateisystem gehen. Sie müssen folgenden Inhalt enthalten: - Benutzer-ID, Fehlernummer, Fehlertext, Dateiname, Funktionsname, Thread-ID, Systemdatum und jeden anderen Kontext.

Jetzt spreche ich nur noch über die Protokolle in den Dateien.

1) Halten Sie sie asynchron. E/A-Betrieb ist teuer.

2) Entwerfen Sie sie als Klasse als Funktion. Zukünftige Änderungen werden einfach sein.

3) Halten Sie sie nach Möglichkeit als Singleton. Singleton ist in Multithreading schwierig, also richtig entwerfen.

4) Auch besser, um die Interaktion zwischen Logger und Loggee einfach zu halten. Meistens senden Sie die Nachrichtennummer als den tatsächlichen Nachrichtentext und lassen Sie den Logger die Nachricht von der Nummer abrufen. Dies ist hilfreich, wenn wir später Änderungen an den generischen Protokollformaten vornehmen möchten.

Normalerweise sollten Logger und auch die Dinge, die wir protokollieren müssen, Teil des Designs sein. Ich habe Fälle gesehen, in denen Änderungen am Design vorgenommen wurden, um sicherzustellen, dass alle relevanten Informationen ordnungsgemäß protokolliert werden.

2
Manoj R

Probieren Sie Log4Net aus. Hiermit können Sie Dateien oder Datenbanken anmelden. Hier ist Tutorial !

Wir verwenden Log4Net in allen unseren Projekten.

1
bittech

Die Verwendung einer Protokolldatei bringt einige Probleme mit sich. Erstens können Fehler auftreten, wenn mehrere Prozesse versuchen, auf die Datei zuzugreifen. Sie können auch Probleme bekommen, wenn Sie versuchen, die Datei zu durchlaufen oder zu löschen, während Ihr System ausgeführt wird. Der Weg dahin ist die Verwendung einer Datenbank.

Schritt 1 besteht also darin, eine Datenbanktabelle zu erstellen. Ich schlage folgende Felder vor:
* Benutzeridentifikation
* Aktion (zB Anmeldung, foo löschen)
* Beschreibender Text (hier Nullen zulassen)
* Zeitstempel

Schritt 2: Erstellen Sie eine gespeicherte Prozedur mit Eingabe für Benutzer-ID, Aktion und beschreibenden Text. Verwenden Sie einfach die aktuelle Zeit, um den Zeitstempel zu erstellen.

Schritt 3: Schreiben Sie eine Protokollierungsmethode in eine praktische gemeinsam genutzte Bibliothek, damit Sie sie überall problemlos einbinden und diese Methode nach Bedarf aufrufen können. Möglicherweise möchten Sie auch eine Flag-Logik für die Protokollierungsstufe haben, um die Protokollierung zu ändern.

Schritt 4: Erstellen Sie eine Wartungsroutine, um von Zeit zu Zeit alte Nachrichten aus der Protokollierungstabelle zu löschen. Möglicherweise löschen, wenn älter als X, jede Woche oder so im Rahmen der regelmäßigen DB-Wartung (Indexwiederherstellung usw.) ausgeführt werden.

Sobald Sie dies einmal erstellt haben, sollten Sie in der Lage sein, den in anderen Projekten enthaltenen Code zu verwenden.

0
adam f