Bewährte Methoden zum Protokollieren von Benutzeraktionen in der Produktion

21

Ich hatte vor, viele verschiedene Dinge in meiner Produktionsumgebung zu protokollieren, zum Beispiel wenn ein Benutzer:

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

Ist dies eine gute Praxis 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. Ich suche nach den besten Methoden, um Aktionen auf einer Website nachzuverfolgen, oder ob es sich um die besten Methoden handelt.


quelle
1
Ich würde wahrscheinlich Databaseüber eine Textdatei vorschlagen ...
@ DaveZych: hängt vom Zweck der Protokollierung ab. Wenn das Tracking / Tracing von Fehlern zu diesem Zweck gehört, ist die Datenbank ausgefallen. Siehe programmers.stackexchange.com/questions/92186/…
Marjan Venema
Ich habe eine Basisimplementierung von durchgeführt . a User Activity Logger that hooks up various eventsSie können sie hier sehen: stackoverflow.com/questions/30326673/… . Genießen!
Jeremy Thompson

Antworten:

29

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 , Kratzer auf dem a **, alles. Wenn es die Web-basierte, betrachten mit Wärme abbildet , so dass Sie wissen , was ihre Maus tat.

Als ich in den späten 70er Jahren bei Xerox am BravoX-Projekt beteiligt war, haben wir pixelweise Mausbewegungen aufgezeichnet, um herauszufinden, wie Benutzer dieses seltsame Ding namens WYSIWYG-Editor verwenden könnten. Wir sahen uns während des Mittagessens die Wiedergaben von Benutzersitzungen an. Es war sehr lehrreich. Wir entdeckten ein Verwendungsmuster, das wir Charlie Browning nannten - der Benutzer wählte einen Text aus und machte ihn kursiv ... dann machten sie es rückgängig ... dann machten sie es wieder ... hin und zurück, hin und zurück. Es stellte sich heraus, dass sie versuchten, dieses Zeug auf einer emotionalen Ebene zu verstehen. Also haben wir (Greg Kusnik hat den Code gemacht, wenn Speicher zur Verfügung steht) einige spezifische Optimierungen vorgenommen, um genau dieses Verhalten zu unterstützen.

Ohne die Aufnahme hätten wir nie gedacht, dies zu tun.

Peter Rowell
quelle
1
Sie könnten ein Buch schreiben, in dessen Mittelpunkt nur dieser Kommentar steht!
Bischof
Bei dieser speziellen Art der Protokollierung ging es ausschließlich um die Benutzererfahrung in Echtzeit, sodass ich nicht der Autor sein würde. Ich war Mr. Hardcopy. Wenn Sie auf " Drucken" geklickt haben, habe ich die interne Darstellung des Dokuments in eine Seitenbeschreibungssprache konvertiert und es dann über dieses seltsame Element namens " Ethernet" an die ersten Laserdrucker der Welt gesendet , die sich ganz in der Nähe befanden. Die Gruppen, mit denen ich am meisten interagierte, waren die Typografieabteilung des US-Senats und die Druckgruppe des IWF, zwei unserer besten und anspruchsvollsten Beta-Test-Sites. Ich habe viel über Layout, Schriftarten usw. von diesen Leuten gelernt . Gute Zeiten.
Peter Rowell
9

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. Wenn Sie log4net (oder ein anderes Protokollierungsframework) verwenden, können Sie vermeiden, das Rad neu zu erfinden und Rolling File Appenders, Warnungs- / Fehler- / Debug- / Info-Codes, das Schreiben von Batch-Dateien usw. zu nutzen. Es ist immer eine gute Idee, eine gute Anmeldung vorzunehmen Beliebige produktionsnahe Anwendung.

In Wirklichkeit ist es wahrscheinlich besser, alle diese Informationen in einer Datenbank zu speichern. Mithilfe einer Datenbank können Sie sie sortieren, aggregieren und Statistiken einfacher erstellen

devshorts
quelle
3
Sie können Ihren Kuchen haben und ihn essen: Es gibt einen DatabaseAppender für log4net: logging.apache.org/log4net/release/config-examples.html . Wenn Sie sich jedoch Gedanken über die Leistung machen, können Sie sich auch in Dateien anmelden und diese in einem separaten Dienst analysieren, um die Daten für eine schnellere Berichterstellung vorzubereiten (dies kann eine Berichtsdatenbank sein).
Grimasse der Verzweiflung
8

Protokolldateien werden verwendet, um Informationen zum Debuggen von Systemfehlern zu erhalten. 2. um die Benutzeraktivität auf Unfug zu untersuchen oder 3. um zu verstehen, wie Leute das System benutzen, wenn Sie nicht hingehen können, um sie zu beobachten. 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, ausgenommen für Kennwörter. Ich mag es, Begrenzer um jeden Parameter in den Protokollen zu setzen, zB phone{(999)999-9999} email{[email protected]}. Passwörter sollten nur auf eine Art und Weise in die Datenbank geschrieben werden , kryptografisch sichere Hash-Funktion mit eindeutigem Salt für jeden Benutzer und mehreren Hash-Runden (siehe Fußnote).
  • Bei der Anmeldung sollten Sie die IP-Adresse, die Benutzer-ID, den Namen und die Anzahl der fehlgeschlagenen Anmeldungen des Benutzers, möglicherweise den Browser, möglicherweise die Cookie-Sitzungs-ID, jedoch niemals das Kennwort, protokollieren.
  • Denken Sie daran, das Kennwort nicht auf der Anmeldeseite UND der Seite zum Ändern des Kennworts zu protokollieren. Sie sollten auch nicht die geheime Frage oder Antwort protokollieren, wenn Sie über diese Funktionalität verfügen. Andere Passwörter oder Verschlüsselungsschlüssel dürfen nicht protokolliert werden. Es ist empfehlenswert, für diese Parameter so etwas wie sechs Sterne in das Protokoll zu schreiben, damit Sie feststellen können, dass Sie daran gedacht haben, diese Daten zu unterdrücken.
  • Ich möchte die Gesamtzeit protokollieren, die für die Bearbeitung jeder Anfrage benötigt wird: Done: 49ms
  • Ich möchte Änderungen am Sitzungsstatus protokollieren. Diese sollten selten sein.
  • Wie bereits erwähnt, gibt es großartige Protokollierungsbibliotheken, mit denen Sie in Dateien protokollieren können. Sie sind sich nicht sicher, ob Sie in Datenbanken protokollieren können.
  • Bewahren Sie Protokolle sicher auf. Auch ohne Passwörter gibt es staatliche, bundesstaatliche und internationale Gesetze zu personenbezogenen Daten (siehe Safe Harbor ), die Protokolldaten vertraulich machen.
  • Machen Sie Backups. Wenn Sie sie jede Nacht in eine vollständige Laufwerksicherung einfließen lassen, müssen Sie sie unbedingt an einem anderen Ort sichern, bevor Sie auf einen neuen Server aktualisieren (fragen Sie mich nicht, wie ich das gelernt habe).

Andere Tipps

Fußnote: Um sich anzumelden, müssen Sie das angegebene Kennwort mit demselben Hashing-Algorithmus und dem Salt des ursprünglichen Hashs für diesen Benutzer hashen. 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.

GlenPeterson
quelle
2

Sie geben nicht an, ob Sie eine Datenbank verwenden. Wenn dies jedoch der Fall ist und diese Datenbank SQL Server ist, können Sie eine Funktion namens AutoAudit hinzufügen und alle Interaktionen mit Ihren Daten automatisch protokollieren. Stellen Sie nur sicher, dass Sie nur die Objekte angeben, die Sie prüfen möchten.

Auf jeden Fall würde ich nicht versuchen, mein Tracking manuell zu codieren, da dies zu einem Wartungs-Albtraum führen würde.

Verwenden Sie für die Protokollierung nicht die Enterprise Library Logging oder Log4Net oder ähnliches.

Richard
quelle
2

Nur ein allgemeiner Rat. Möglicherweise steht es nicht in direktem Zusammenhang mit Ihrer Frage.

Es hängt davon ab, wofür Sie Protokolle verwenden werden. Meist werden in der Produktion Protokolle verwendet, um die Vorgänge zu ermitteln, 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. Aber die serverseitigen Protokolle wie "Fehler aufgetreten, da ein Teil des Texts leer ist" sind nicht Teil der Funktion. Diese Dinge müssen im Dateisystem gehen. Sie müssen folgende Inhalte enthalten: - Benutzer_ID, Fehlernummer, Fehlertext, Dateiname, Funktionsname, Thread_ID, Systemdatum_Zeit und jeden anderen Kontext.

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

1) Halten Sie sie asynchron. E / A-Operationen sind kostspielig.

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

3) Bewahren Sie sie möglichst einzeln auf. Singleton ist in Multithreading-Umgebungen schwierig. Entwerfen Sie daher ordnungsgemäß.

4) Auch besser, um die Interaktion zwischen Logger und Loggee einfach zu halten. Meistens wird die message_number als der eigentliche message_text gesendet, und der Logger erhält die Nachricht von der Nummer. Dies hilft, 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.

Manoj R
quelle
1

Versuchen Sie es mit Log4Net. Mit Log4Net können Sie sich in Dateien oder Datenbanken einloggen. Hier ist Tutorial !

Wir setzen Log4Net in allen unseren Projekten ein.

bittech
quelle
0

Die Verwendung einer Protokolldatei wirft einige Probleme auf. 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 läuft. Der Weg dahin ist die Verwendung einer Datenbank.

Schritt 1 besteht also darin, eine Datenbanktabelle zu erstellen. Ich schlage folgende Felder vor:
* userID
* action (zB logon, delete foo)
* Beschreibender Text (hier Nullen zulassen)
* timestamp

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

Schritt 3: Schreiben Sie eine Protokollierungsmethode in eine praktische gemeinsam genutzte Bibliothek, damit Sie sie problemlos überall einbinden können, und üben Sie, diese Methode nach Bedarf aufzurufen. Möglicherweise möchten Sie auch eine Protokollierungsstufen-Flag-Logik haben, um zu ändern, was protokolliert wird.

Schritt 4: Erstellen Sie eine Wartungsroutine, um von Zeit zu Zeit alte Nachrichten aus der Protokollierungstabelle zu löschen. Vielleicht löschen, wenn älter als X, jede Woche oder so im Rahmen der regulären DB-Wartung (Indexwiederherstellung usw.).

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

Adam f
quelle