In Datei oder in Datenbanktabelle protokollieren?

12

Ich entwickle eine Webanwendung, die MS SQL für verschiedene Daten verwendet: Benutzer, Benutzerkonten, Benutzerlizenzen, Lizenzpreise, Rechnungen.

Ich muss die Echtzeitnutzung des Systems durch die Benutzer protokollieren und diese für die monatliche Abrechnung verwenden: z. B. protokollieren, wann immer ein Benutzer eine bestimmte Seite / URL erhält, und die Benutzer am Monatsende anhand der Anzahl der abgerufenen Seiten abrechnen.

  • Soll ich diese Protokollereignisse in eine Tabelle in meiner MS SQL-Datenbank schreiben?

  • Soll ich diese Protokollereignisse in eine reine Nicht-SQL-Anhängeprotokolldatei schreiben?

  • Soll ich diese Protokollereignisse für jeden Benutzer in eine andere Protokolldatei schreiben?

Hierbei handelt es sich nicht um eine Website mit besonders hohem Datenaufkommen. Beispielsweise führen maximal 10.000 Benutzer durchschnittlich 5 protokollierbare Ereignisse pro Tag aus => 50.000 Ereignisse pro Tag = 30 Ereignisse pro Minute = 18.000.000 Ereignisse pro Jahr.

Ich frage, weil eine der beiden Optionen sinnvoll erscheint und ich nicht sehe, ob man einen klaren Vorteil hat.

Die mit einem abrechenbaren Ereignis verbundenen Daten sind einfach:

  • Benutzer-ID (Fremdschlüsselbeziehung zur Users-Tabelle in SQL)
  • Datum (und Uhrzeit
  • URL der abzurechnenden Seite

Meine eigene Antwort auf diese Frage lautet wie folgt:

  • Einige Vorteile des Schreibens des Protokolls in eine Datenbanktabelle:

    • Relationale Integrität: Beispielsweise werden protokollierte Ereignisse gültigen Benutzer-IDs zugeordnet (indem die Benutzer-ID als Fremdschlüssel zwischen den Tabellen definiert wird).
    • Gut lesbar für die Abrechnung: ZB SELECT COUNT GROUP BYum die Anzahl der Log-Ereignisse pro Benutzer zu ermitteln
  • Einige Vorteile des Schreibens in eine Protokolldatei:

    • Einfachere Leistung: SQL wird seltener verwendet, z. B. nur für Benutzeranmeldungsereignisse, und meist nur zum Lesen
    • Einfachere Verwaltung: Einfachere Archivierung alter Daten, z. B. zum Jahresende, durch Verschieben alter Protokolldateien anstatt durch Löschen / Archivieren aus der Datenbank

Bitte lassen Sie mich wissen, wenn meine Antwort falsch ist. oder übertreibt die Wichtigkeit von etwas; oder hat einige wichtige Überlegungen vergessen.

Und / oder lassen Sie mich bitte wissen, wie Ihre Antwort lautet, falls sie sich von meiner unterscheidet.

ChrisW
quelle
3
Sie müssen die für Geschäftsentscheidungen verwendeten Informationen von den allgemeinen Protokollinformationen trennen. Speichern Sie alle Daten, die später von Ihrer Anwendung verwendet werden, in der Datenbank, die anderen Daten in Protokolldateien.
Tom
1
Wenn Sie ein bekanntes Paket wie log4net verwenden - und es wäre wahrscheinlich eine gute Idee, anstatt Ihr eigenes zu rollen -, sollte es nur eine Frage des Umklappens der Konfiguration sein, um dies zu tun. @tom - Trennung ist nett, aber warum nicht einfach zwei Datenbanken haben, eine für Live-Daten und eine für die Archivierung von Protokollen usw.?
Julia Hayward
2
Das OP sagt, es ist für die monatliche Abrechnung - also hätte ich erwartet, dass das Anwenden der Abrechnungslogik auf eine Datenbank viel einfacher wäre als Flatfiles?
Julia Hayward
1
Sie haben den Begriff "SQL" verwendet, als Sie "Datenbank" meinten. Ich habe einige Korrekturen vorgenommen. SQL ist eine Sprache, die Sie zum Lesen und Schreiben von Datenbanken verwenden. MS SQL Server ist der Name eines RDBMS. "SQL" allein bedeutet nicht "MS SQL Server-Datenbank".
Tulains Córdova
1
@gnat Ich glaube nicht, dass dies ein Duplikat ist: Beim anderen ging es um die Protokollierung von Fehlern, während es um die Protokollierung der Verwendung für die Abrechnung ging (und in diesem Fall lautete die bestätigte und akzeptierte Antwort, ein RDBMS zu verwenden).
ChrisW

Antworten:

13

Da Sie diese Informationen für Abrechnungszwecke verwenden, verstehe ich nicht, warum Sie sie nicht in der Datenbank haben möchten, in der sie einfach abgefragt, aggregiert, gemeldet und mit anderen Daten verknüpft werden können.

Ich denke auch, dass es viel einfacher ist, eine einzelne Datenbanktabelle zu verwalten, die die Protokollinformationen enthält, als mehrere separate Protokolldateien. Dasselbe gilt für Ihre Bedenken hinsichtlich der Auslastung des Servers - es gibt viel bessere Möglichkeiten, damit umzugehen, als auf das Speichern von Daten in Einfachdateien zurückzugreifen.

Ihre dritte Option ist übrigens, beides zu tun. Verwenden Sie die Datenbank für die meisten Anforderungen, verfügen Sie jedoch über die Protokolldatei für Überwachungszwecke.

GroßmeisterB
quelle
3
Ein weiterer Bonus für die Verwendung einer Datenbank ist die Verwendung von Triggern für bestimmte Protokollierungen. Es wäre kein zusätzlicher Code erforderlich. Wenn Daten in Tabelle A eingefügt werden, fügen Sie die Protokollmeldung X ein.
Greg Burghardt