2008-10-16 8 views
19

Ich habe eine Multi-User-Anwendung, die eine zentralisierte Logdatei für die Aktivität hält. Im Moment wird dieses Logging in Textdateien im Umfang von etwa 10MB-50MB/Tag umgesetzt. Die Textdateien werden täglich vom Logger rotiert und wir behalten die letzten 4 oder 5 Tage im Wert. Älter als das interessiert uns nicht.Verwenden eines SQL Servers für die Anwendungsprotokollierung. Für und Wider?

Sie werden selten gelesen: Entweder bei der Entwicklung der Anwendung für Fehlermeldungen, Diagnosemeldungen oder wenn die Anwendung in Produktion ist, um eine Triage für ein vom Benutzer gemeldetes Problem oder einen Fehler durchzuführen.

(Dies ist streng ein Anwendungsprotokoll. Sicherheitsprotokollierung an anderer Stelle gehalten wird.)

Aber wenn sie gelesen werden, sind sie ein Schmerz in den Arsch. Grepping von 10MB Textdateien macht auch mit Perl keinen Spaß: Die Felder (Transaktions-ID, Benutzer-ID, etc ..) in der Datei sind nützlich, aber nur Text. Nachrichten werden sequentiell nacheinander geschrieben, so dass verschachtelte Aktivitäten durcheinander geraten, wenn versucht wird, einer bestimmten Transaktion oder einem bestimmten Benutzer zu folgen.

Ich bin auf der Suche nach Gedanken zu dem Thema. Hat jemand eine Protokollierung auf Anwendungsebene mit einer SQL-Datenbank durchgeführt und mochte es? Fand ich furchtbar?

+0

Wirklich meinst du irgendein RDBMS. Nein? Ich meine, entweder loggen Sie sich in Dateien ein oder Sie loggen sich in eine Datenbank ein, richtig? –

Antwort

13

Ja, wir machen es hier, und ich halte es nicht aus. Ein Problem, das wir hier haben, ist, wenn es ein Problem mit der Datenbank gibt (Verbindung, beschädigt usw.), stoppt die Protokollierung. Mein anderes großes Problem damit ist, dass es schwierig ist, durchzusehen, um Probleme zu verfolgen. Wir haben auch hier Probleme mit den Tabellenprotokollen, die zu viel Speicherplatz beanspruchen, und wir müssen uns darum sorgen, sie zu kürzen, wenn wir Datenbanken verschieben, weil unsere Protokolle so groß sind.

Ich denke, es ist klobig im Vergleich zu Protokolldateien. Ich finde es schwierig, das "große Bild" zu sehen, wenn es in der Datenbank gespeichert wird. Ich gebe zu, ich bin eine Person mit Logfiles, ich mag es, eine Textdatei zu öffnen und sie (regex) durchzusehen, anstatt sql zu benutzen, um etwas zu suchen und zu suchen.

Der letzte Ort, an dem ich arbeitete, hatten wir Log-Dateien von 100 meg plus. Sie sind ein wenig schwierig zu öffnen, aber wenn Sie das richtige Werkzeug haben, ist es nicht so schlimm. Wir hatten ein System, um Nachrichten zu protokollieren. Sie können sich die Datei schnell ansehen und feststellen, welcher Satz von Protokolleinträgen zu welchem ​​Prozess gehört.

17

Wir haben eine Log-Datenbank bei meinem letzten Job verwendet, und es war großartig.

Wir hatten Prozeduren gespeichert, die Übersichten über den allgemeinen Systemzustand für verschiedene Metriken ausspuckten, die ich von einer Webseite laden konnte. Wir könnten auch schnell einen Trace für eine bestimmte App über einen bestimmten Zeitraum ausspucken, und wenn ich wollte, war es leicht, das als Textdatei zu bekommen, wenn Sie wirklich nur Greping-Dateien mögen.

Um sicherzustellen, dass das Logging-System selbst kein Problem wird, gibt es natürlich ein gemeinsames Code-Framework, das wir zwischen verschiedenen Apps verwendet haben, die das Schreiben in die Log-Tabelle behandelt haben. Teil dieses Frameworks enthalten auch Protokollierung in eine Datei, falls das Problem mit der Datenbank selbst ist, und ein Teil davon beinhaltet das Radfahren der Protokolle. Was die Platzprobleme anbetrifft, so befindet sich die Protokolldatenbank in einem anderen Sicherungsplan und dies ist wirklich kein Problem. Platz (nicht gesichert) ist billig.

Ich denke, dass die meisten der anderswo geäußerten Bedenken adressiert. Es ist alles eine Frage der Umsetzung. Aber wenn ich hier anhielte, wäre es immer noch ein Fall von "nicht viel schlimmer", und das ist ein schlechter Grund, sich die Mühe zu machen, DB-Logging einzurichten. Was mir daran gefallen hat ist, dass es erlaubt uns einige neue Dinge zu tun, die mit flachen Dateien viel schwerer zu tun wäre.

Es gibt vier Haupt-Verbesserungen gegenüber Dateien. Die erste ist die Systemübersichten, die ich bereits erwähnt habe. Die zweite, und am wichtigsten, war eine Überprüfung, um zu sehen, ob eine App Nachrichten fehlte, wo wir normalerweise erwarten würden, sie zu finden. So etwas ist fast unmöglich in der herkömmlichen Dateiprotokollierung zu erkennen, es sei denn, Sie verbringen jeden Tag eine Menge Zeit mit der Überprüfung von sinnlosen Logs für Apps, die Ihnen in 99% aller Fälle sagen, dass alles in Ordnung ist. Es ist erstaunlich, wie man die Ansicht freigibt, um fehlende Protokolleinträge anzuzeigen. An den meisten Tagen mussten wir uns die meisten Log-Dateien überhaupt nicht ansehen ... etwas, das ohne die Datenbank gefährlich und unverantwortlich wäre.

Das bringt die dritte Verbesserung. Wir generierten eine einzige tägliche Status-E-Mail, und es war die nur Sache, die wir an Tagen überprüfen mussten, an denen alles normal lief. Die E-Mail enthielt Fehler und Warnungen. Fehlende Protokolle wurden als Warnung von demselben db-Job erneut protokolliert, der die E-Mail gesendet hat, und das Fehlen der E-Mail war eine große Sache. Wir könnten eine bestimmte Log-Nachricht an unseren Bug-Tracker mit einem Klick senden, direkt aus der täglichen E-Mail (es war HTML-formatiert, zog Daten aus einer Web-App).

Die letzte Verbesserung war, dass, wenn wir eine bestimmte App enger folgen wollten, sagen Sie nach der Änderung, wir einen RSS-Feed für diese spezielle Anwendung abonnieren könnten, bis wir zufrieden waren. Es ist schwieriger, das aus einer Textdatei zu machen.

Wo ich jetzt bin, verlassen wir uns viel mehr auf Tools von Drittanbietern und deren Protokollierung Fähigkeiten, und das bedeutet wieder auf eine Menge mehr manuelle Überprüfung gehen. Ich vermisse wirklich die DB, und ich überlege mir, ein Tool zu schreiben, um diese Logs zu lesen und sie erneut in eine DB zu schreiben, um diese Fähigkeiten zurückzubekommen.

Auch wir haben dies mit Textdateien als Ausweich, und es sind die neuen Fähigkeiten, die wirklich die Datenbank lohnt. Wenn Sie nur in eine Datenbank schreiben und versuchen, sie auf die gleiche Weise wie die alten Textdateien zu verwenden, fügt das unnötige Komplexität hinzu und Sie können genauso gut die alten Textdateien verwenden. Es ist die Fähigkeit, das System für neue Funktionen aufzubauen, die es sich lohnen.

+0

Wie machst du Datenbank anmelden, möchte ich ähnliche Art von Logging-Mechanismus zu implementieren und wollte sehen, was ist der Standard oder die beste Art der Anmeldung in der Datenbank, jede Architektur Anleitung würde sehr geschätzt werden. – Rachel

+1

@Rachel Alles, was ich getan habe, war die Implementierung eines [TraceListener] (http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx), der Nachrichten in die Datenbank geschrieben hat. Dann war die gesamte Protokollierung nur [System.Diagnostics.Trace] (http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.aspx) Aufrufe: einfach peasy. Ein Teil des allgemeinen Frameworks in unseren Apps war Code, um sowohl unseren benutzerdefinierten tracelistener als auch einen TextWriterTraceListener für die richtige Protokolldatei zu laden. –

+0

Danke für die Eingaben, aber kennst du eine ähnliche Vorgehensweise in Java? – Rachel

3

Ich denke, das Problem, das Sie mit der Protokollierung haben, konnte mit der Protokollierung in SQL, gelöst werden, dass Sie in der Lage sind, die Felder, die Sie interessieren, in verschiedene Spalten aufteilen. Sie können die SQL-Datenbank nicht wie ein Textfeld behandeln und erwarten, dass es besser ist, wird es nicht.

Sobald Sie alles, was Sie in die Protokollierung zu den Spalten interessiert sind Sie es in möchten, ist es viel einfacher, die sequentielle Aktionen von etwas zu verfolgen, durch die Möglichkeit, es durch Spalte zu isolieren. Wie bei einem "Entry" -Prozess protokolliert man alles normal, wobei der Text "Entry Process" in die Spalte "logtype" oder "process" gesetzt wird. Wenn Sie dann Probleme mit dem "Eingabevorgang" haben, isoliert eine WHERE-Anweisung für diese Spalte alle Eingabevorgänge.

0

ich es gut funktioniert sehen konnte, vorausgesetzt, Sie die Fähigkeit was Bedürfnisse filtern musste angemeldet sein und wenn es angemeldet werden muss. Eine Protokolldatei (oder eine Tabelle, wie sie ist) ist nutzlos, wenn Sie nicht finden, was Sie suchen oder unnötige Informationen enthält.

3

Wir haben vor SQL Server zentralisiert Protokollierung verwendet, und als die vorherigen erwähnt gepostet, das größte Problem war, dass unterbrochene Verbindung zur Datenbank unterbrochen Protokollierung bedeuten würde. Tatsächlich fügte ich der Protokollierung eine Warteschlangenroutine hinzu, die zuerst die DB testen und bei einem Fehler in eine physische Datei schreiben würde. Sie müssten dieser Routine nur Code hinzufügen, der bei einem erfolgreichen Protokoll für die Datenbank prüfen würde, ob weitere Einträge lokal in der Warteschlange stehen, und diese auch schreiben.

Ich mag alles in einer Datenbank, im Gegensatz zu physischen Protokolldateien, aber nur weil ich es gerne mit Berichten, die ich geschrieben habe, analysiere.

+0

Wie haben Sie es implementiert, was ist die Architektur dahinter? – Rachel

+0

@Rachel: Es war ziemlich einfach - ich hatte einen zweistufigen Logging-Prozess, wo es zuerst versuchen würde, an die entfernte Datenbank zu protokollieren, Schreiben in eine XML-Datei, wenn das fehlschlug, und dann der zweite Schritt war, dass es die lokale XML-Datei für alle Einträge und senden Sie diese an die Datenbank (vorausgesetzt, der erste Aufruf war erfolgreich). Auf diese Weise wurde der Catch-Block für den Datenbankprotokollierungsversuch lokal gespeichert, und nach einem erfolgreichen Datenbankaufruf wurde immer geprüft, ob etwas anderes zu tun war. Da ich in einem Hintergrundthread in das Logbuch schreibe, habe ich die App nie gehalten. – SqlRyan

+0

Wenn möglich, würde ich gerne etwas Code oder Pseudocode sehen, um zu verstehen, wie dies getan wird, da ich ähnliche Anforderung habe, dachte ich daran, nur Entity erstellen und speichern Sie es in der Datenbanktabelle und mit Hibernate für die Interaktion und dann Funktion, die würde nehmen Sie Zeichenkette auf und speichern Sie diese Zeichenkette in der Entität und speichern Sie in der Tabelle und rufen Sie diese Funktion von anderer Funktion auf und führen Sie Protokollierungsinformationen aus, ich bin nicht 100% sicher, wenn dieses eine gute Weise ist, es zu tun oder sogar wenn es machbar ist und also lernen wollte dein Ansatz – Rachel

2

Wir machen es in unserer Organisation in großen Mengen mit SQL Server. In meinem Openion ist das Schreiben in die Datenbank wegen der Such- und Filterfunktion besser. Leistungswerte von 10 bis 50 MB Daten und halten es nur für 5 Tage, hat keinen Einfluss auf Ihre Anwendung. Das Verfolgen von Transaktionen und Benutzern ist sehr einfach im Vergleich zum Verfolgen von Textdateien, da Sie nach Transaktion oder Benutzer filtern können.

Sie erwähnen, dass die Dateien selten lesen. Entscheiden Sie, ob es sich lohnt, Zeit in die Entwicklung zu investieren, um das Protokollierungs-Framework zu entwickeln? Berechnen Sie die Zeit, die Sie für das Durchsuchen der Protokolle aus Protokolldateien in einem Jahr benötigen, im Vergleich zu der Zeit, die für das Codieren und Testen benötigt wird. Wenn die Zeit für die Suche nach Protokollen mindestens 1 Stunde pro Tag beträgt, sollten Protokolle in der Datenbank gespeichert werden. Das kann den Zeitaufwand für die Lösung von Problemen drastisch reduzieren.

Wenn Sie weniger als eine Stunde verbringen, dann können Sie einige Textsuchwerkzeuge wie "SRSearch" verwenden, ein großartiges Tool, das ich verwendet habe, sucht aus mehreren Dateien in einem Ordner und gibt Ihnen die Ergebnisse in kleinen Snippts (" wie Google Suchergebnis "), wo Sie klicken, um die Datei mit dem Ergebnis interessiert zu öffnen. Es gibt auch andere Textsuchwerkzeuge. Wenn die Umgebung Windows ist, dann haben Sie Microsoft LogParser auch ein gutes Tool kostenlos zur Verfügung, wo Sie Ihre Datei wie eine Datenbank abfragen können, wenn die Datei in einem bestimmten Format geschrieben wird.

22

Ich denke, dass das Protokollieren direkt in einer Datenbank in der Regel eine schlechte Idee ist, und ich würde es vermeiden.

Der Hauptgrund ist dies: ein gutes Protokoll wird am nützlichsten sein, wenn Sie es verwenden können, um Ihre Anwendung post-mortem zu debuggen, sobald der Fehler bereits aufgetreten ist und Sie es nicht reproduzieren können. Um dies zu tun, müssen Sie sicherstellen, dass die Protokollierung selbst zuverlässig ist. Und um ein System zuverlässig zu machen, ist es ein guter Anfang, es einfach zu halten.

So ein einfaches dateibasiertes Protokoll mit nur ein paar Zeilen Code (Datei öffnen, Zeile anhängen, Datei schließen oder geöffnet halten, wiederholen ...) ist in der Regel in der Zukunft zuverlässiger und nützlicher Du brauchst es wirklich, um zu funktionieren.

Auf der anderen Seite erfordert die erfolgreiche Protokollierung auf einem SQL-Server, dass viel mehr Komponenten korrekt funktionieren, und es gibt viel mehr mögliche Fehlersituationen, in denen Sie nicht in der Lage sind, die benötigten Informationen einfach zu protokollieren weil die Log-Infrastruktur selbst nicht funktioniert. Und etwas Schlimmes: Ein Fehler in der Protokoll-Prozedur (wie eine Datenbankbeschädigung oder ein Deadlock) wird wahrscheinlich die Leistung der Anwendung beeinträchtigen, und dann haben Sie eine Situation, in der eine sekundäre Komponente die Anwendung der primären Funktion verhindert.

Wenn Sie viele Analysen der Protokolle durchführen müssen und nicht mit textbasierten Tools wie grep vertraut sind, behalten Sie die Protokolle in Textdateien und importieren Sie sie regelmäßig in eine SQL-Datenbank. Wenn das SQL fehlschlägt, gehen keine Protokollinformationen verloren, und die Funktionsfähigkeit der Anwendung wird nicht beeinträchtigt. Dann können Sie alle Datenanalysen in der Datenbank durchführen.

Ich denke, das sind die Hauptgründe, warum ich nicht auf eine Datenbank protokollieren, obwohl ich es in der Vergangenheit getan habe. Ich hoffe es hilft.

1

Sie könnten in einem durch Kommas oder Tabulator getrennten Textformat protokollieren oder Ihre Protokolle in ein CSV-Format exportieren. Wenn Sie aus einem Protokoll lesen müssen, exportieren Sie Ihre CSV-Datei in eine Tabelle auf Ihrem SQL-Server. Dann können Sie mit Standard-SQL-Anweisungen abfragen. Um den Prozess zu automatisieren, können Sie SQL Integration Services verwenden.

0

Da Ihre Protokolle selten gelesen werden, würde ich sie auf Datei schreiben (bessere Leistung und Zuverlässigkeit).

Dann, wenn und nur wenn Sie sie lesen müssen, würde ich die Protokolldatei in einer Datenbank importieren (bessere Analyse).

Dadurch erhalten Sie die Vorteile beider Methoden.

1

Hier sind einige zusätzliche Vor- und Nachteile und der Grund, warum ich Logfiles bevorzugen anstelle von Datenbanken:

  1. Raum nicht billig ist, wenn VPS verwenden. Das Wiederherstellen von Speicherplatz auf Live-Datenbanksystemen ist oft ein großer Aufwand und Sie müssen möglicherweise Dienste herunterfahren, während Sie Speicherplatz wiederherstellen. Wenn Ihre Protokolle so wichtig sind, dass Sie sie jahrelang behalten müssen (wie wir es tun), dann ist das ein echtes Problem. Denken Sie daran, dass die meisten Datenbanken beim Löschen von Daten keinen Speicherplatz wiederherstellen, da sie den Speicherplatz einfach wiederverwenden. Dies ist nicht hilfreich, wenn der Speicherplatz knapp wird.

  2. Wenn Sie auf die Protokolle zugreifen und täglich Berichte aus einer Datenbank mit einer riesigen Protokolltabelle und Millionen von Datensätzen abrufen müssen, wirken sich die Datenbankdienste bei der Abfrage der Daten aus der Datenbank negativ auf die Leistung aus.

  3. Protokolldateien können erstellt und ältere Protokolle täglich archiviert werden. Abhängig von der Art der Protokolle können große Mengen an Speicherplatz durch Archivierung von Protokollen wiederhergestellt werden. Wir sparen rund sechs Mal den Platz, wenn wir unsere Protokolle komprimieren, und in den meisten Fällen sparen Sie wahrscheinlich viel mehr.

  4. Einzelne kleinere Protokolldateien können problemlos komprimiert und übertragen werden, ohne den Server zu beeinträchtigen. Zuvor hatten wir Protokolle, die in den 100-er GB-Daten in einer Datenbank lagen. Das Verschieben solch großer Datenbanken zwischen Servern wird zu einem großen Ärger, insbesondere aufgrund der Tatsache, dass Sie den Datenbankserver dabei herunterfahren müssen. Was ich sage ist, dass Wartung zu einem echten Schmerz an dem Tag wird, an dem Sie anfangen müssen, große Datenbanken zu bewegen.

  5. Schreiben in Protokolldateien im Allgemeinen sind viel schneller als Schreiben in DB. Unterschätzen Sie nicht die Geschwindigkeit Ihrer Betriebssystem-Datei IO.

  6. Log-Dateien saugen nur, wenn Sie Ihre Protokolle nicht ordnungsgemäß strukturieren. Möglicherweise müssen Sie zusätzliche Tools verwenden, und Sie müssen möglicherweise sogar Ihre eigenen entwickeln, um sie zu verarbeiten, aber am Ende wird es sich lohnen.

1

Ich habe alle Antworten gelesen und sie sind großartig. Aber in einer Firma, in der ich aufgrund verschiedener Einschränkungen und Audits gearbeitet habe, musste ich mich in eine Datenbank einloggen. Wie auch immer, wir hatten verschiedene Möglichkeiten zur Protokollierung und die Lösung bestand darin, eine Pipeline zu installieren, in der unsere Programmierer eine Verbindung zur Pipeline herstellen und sich bei einer Datenbank, Datei, Konsole oder sogar einem Protokoll anmelden konnten, um von anderen Anwendungen genutzt zu werden. Diese Pipeline unterbricht den normalen Prozess nicht. Wenn Sie eine Protokolldatei gleichzeitig mit der Anmeldung bei der Datenbank speichern, wird sichergestellt, dass Sie selten eine Leitung verlieren. Ich schlage vor, Sie untersuchen weiter log4net, dass es großartig dafür ist.

http://logging.apache.org/log4net/

Verwandte Themen