Protokollierung ist etwas, das notwendig ist, aber (relativ) selten verwendet wird. Als solches kann es in Bezug auf die Lagerung viel kompakter gemacht werden.
Beispielsweise werden die am häufigsten protokollierten Daten wie IP, Datum, Uhrzeit und andere Daten, die als Ganzzahl dargestellt werden können, als Text gespeichert.
Wenn die Protokollierung als Binärdaten gespeichert wurde, konnte viel Speicherplatz gespart werden, wodurch weniger Rotation und eine längere Lebensdauer der Festplatte erforderlich waren, insbesondere bei SSDs mit eingeschränkten Schreibrechten.
Einige mögen sagen, dass es ein so kleines Problem ist, dass es nicht wirklich wichtig ist, aber angesichts der Anstrengungen, die erforderlich sind, um einen solchen Mechanismus aufzubauen, macht es keinen Sinn, dies nicht zu tun. Jeder kann das für zwei Tage in seiner Freizeit machen, warum machen die Leute das nicht?
Antworten:
systemd
speichert seine Protokolldateien im Binärformat. Die Hauptprobleme, die ich damit gehört habe, sind:vi
,grep
,tail
etc , sie zu analysierenDer Hauptgrund für die Verwendung eines Binärformats (meines Wissens) war, dass es als einfacher erachtet wurde, Indizes usw. zu erstellen, dh es eher wie eine Datenbankdatei zu behandeln.
Ich würde argumentieren, dass der Speicherplatzvorteil in der Praxis relativ gering (und abnehmend) ist. Wenn Sie große Mengen an Protokollen speichern möchten, ist das Zippen von gerollten Protokollen wirklich sehr effizient.
Alles in allem würden sich die Vorteile von Tooling und Vertrautheit in den meisten Fällen auf der Seite der Textprotokollierung verschlechtern.
quelle
myapp.log
bis Mitternacht, und verschiebt diese Datei dannmyapp.log.1
in eine neuemyapp.log
Datei und beginnt mit dem Schreiben in eine neue Datei. Und die Alten werdenmyapp.log.1
bewegtmyapp.log.2
, und so weiter, sie rollen alle mit. Somitmyapp.log
ist immer der aktuelle. Oder sie wechseln, wenn eine bestimmte Größe erreicht ist. Vielleicht setzen sie das Datum und die Uhrzeit in den Dateinamen. Viele Logging-Frameworks unterstützen diese Art von Dingen von Anfang an.rotating
wird auch aus dem verwendet, was mir bekannt ist.Warum verwenden die meisten Protokolldateien nur Text und kein Binärformat?
Suchen Sie im Wikipedia-Artikel zur Unix-Philosophie nach dem Wort "text" , und finden Sie beispielsweise Aussagen wie:
Oder zum Beispiel aus den Grundlagen der Unix-Philosophie ,
Jeder kann das für zwei Tage in seiner Freizeit machen, warum machen die Leute das nicht?
Das Speichern der Protokolldatei in binärer Form ist nur der Anfang (und trivial). Dann müssten Sie Tools schreiben, um:
edit
)tail -f
)grep
)Natürlich kann und tut Software auch binäre Dateiformate (z. B. für relationale Datenbanken), aber es lohnt sich (im Sinne von YAGNI ) normalerweise nicht, dies für Protokolldateien zu tun.
quelle
tail -f
eine Multi-Gigabyte-Protokolldatei verwende, springt diese zum Ende der Datei (mit "Suchen" ohne "Lesen") und liest und zeigt dann nur das Ende der Datei an. Es muss nicht die gesamte Datei dekomprimiert / dekodiert werden.Hier gibt es viele umstrittene Vermutungen.
Protokollierung war ein wesentlicher Bestandteil (fast) jedes Jobs, den ich hatte. Es ist wichtig, wenn Sie die Integrität Ihrer Anwendungen in irgendeiner Form überprüfen möchten. Ich bezweifle, dass es sich um eine "Randnutzung" handelt. Die meisten Organisationen, in die ich involviert war, halten Protokolle für sehr wichtig.
Das Speichern von Protokollen als Binärdatei bedeutet, dass Sie sie dekodieren müssen, bevor Sie sie lesen können. Textprotokolle zeichnen sich durch Einfachheit und Benutzerfreundlichkeit aus. Wenn Sie über die binäre Route nachdenken, können Sie Protokolle auch in einer Datenbank speichern, in der Sie sie abfragen und statistisch analysieren können.
SSDs sind heutzutage zuverlässiger als HDDs, und die Argumente gegen viele Schreibvorgänge sind weitgehend umstritten. Wenn Sie sich wirklich Sorgen machen, speichern Sie Ihre Protokolle auf einer normalen Festplatte.
quelle
Protokolldateien sind ein wichtiger Bestandteil jeder seriösen Anwendung: Wenn die Protokollierung in der App fehlerfrei ist, können Sie sehen, welche Schlüsselereignisse wann stattgefunden haben. welche Fehler sind aufgetreten; und allgemeiner Anwendungszustand, der über die Überwachung hinausgeht. Es ist üblich, von einem Problem zu hören, die integrierte Diagnose der Anwendung zu überprüfen (die Webkonsole zu öffnen oder ein Diagnosetool wie JMX zu verwenden) und dann das zu überprüfen Protokolldateien.
Wenn Sie ein Nicht-Text-Format verwenden, stehen Sie sofort vor einer Hürde: Wie lesen Sie die Binärprotokolle? Mit dem Tool zum Lesen von Protokollen, das sich nicht auf Ihren Produktionsservern befindet! Oder es ist, aber oh je, wir haben ein neues Feld hinzugefügt und dies ist der alte Leser. Haben wir das nicht getestet? Ja, aber niemand hat es hier eingesetzt. In der Zwischenzeit beginnt Ihr Bildschirm zu leuchten, und Benutzer rufen Sie an.
Oder ist das vielleicht nicht deine App, aber du machst Support und glaubst zu wissen, dass es sich um dieses andere System und WTF handelt? Die Protokolle sind in einem binären Format? Ok, fang an Wiki-Seiten zu lesen und wo fängst du an? Jetzt habe ich sie auf meinen lokalen Computer kopiert, aber - sind sie beschädigt? Habe ich eine nicht-binäre Übertragung durchgeführt? Oder ist das Tool zum Lesen von Protokollen durcheinander?
Kurz gesagt, Textlesetools sind plattformübergreifend und allgegenwärtig, und Protokolle sind oft langlebig und müssen manchmal in Eile gelesen werden . Wenn Sie ein Binärformat erfinden, sind Sie von einer ganzen Welt gut verständlicher und benutzerfreundlicher Werkzeuge abgeschnitten. Schwerwiegender Funktionsverlust genau dann, wenn Sie ihn benötigen.
Die meisten Protokollierungsumgebungen machen einen Kompromiss: Halten Sie die aktuellen Protokolle lesbar und aktuell und komprimieren Sie die älteren. Das heißt, Sie profitieren von der Komprimierung - vor allem, weil ein Binärformat die Protokollnachrichten nicht verkleinert. Gleichzeitig können Sie weniger und grep und so weiter verwenden.
Welchen möglichen Nutzen könnte die Verwendung von Binärdateien bringen? Geringe Raumeffizienz - immer unwichtiger. Weniger (oder kleiner) schreibt? Nun, vielleicht - tatsächlich wird sich die Anzahl der Schreibvorgänge auf die Anzahl der Festschreibungen auf der Festplatte beziehen. Wenn also die Protokollzeilen erheblich kleiner als die Blockgröße der Festplatte sind, würde eine SSD ohnehin immer wieder neue Blöcke zuweisen. Binär ist also eine geeignete Wahl, wenn:
Dies klingt jedoch weniger nach Anwendungsprotokollierung. Dies sind Ausgabedateien oder Aktivitätsdatensätze. Das Einfügen in eine Datei ist wahrscheinlich nur einen Schritt vom Schreiben in eine Datenbank entfernt.
BEARBEITEN
Ich denke, hier gibt es eine allgemeine Verwechslung zwischen "Programmprotokollen" (gemäß Protokollierungsrahmen) und "Datensätzen" (wie in Zugriffsprotokollen, Anmeldungsdatensätzen usw.). Ich vermute, die Frage hängt am engsten mit letzterer zusammen, und in diesem Fall ist die Frage weit weniger genau definiert. Es ist durchaus akzeptabel, dass ein Nachrichtendatensatz oder ein Aktivitätsprotokoll in einem kompakten Format vorliegt, zumal es wahrscheinlich genau definiert ist und eher zur Analyse als zur Fehlerbehebung verwendet wird. Dazu gehören Tools
tcpdump
und der Unix-Systemmonitorsar
. Programmprotokolle sind dagegen eher ad hoc.quelle
/var/log/utmp
/ wtmp sind binär . Sie zeichnen auf, wer gerade an welchem Tag angemeldet ist (damit sie nicht nur wachsen), sondern sind eine Form der Protokollierung. (Und es ist nützlich, sie billig analysieren zu können, da verschiedene gebräuchliche Befehlewho
genau das tun.)Ein Beispiel für ein etwas binäres Protokoll ist weit verbreitet: das Windows-Ereignisprotokoll. Auf der Pro-Seite ermöglicht dies, dass Protokollnachrichten praktisch kostenlos sehr wortreich (und damit hoffentlich hilfreich) sind, möglicherweise so etwas wie
Der Hauptteil dieser Nachricht ist nur einmal als Ressource vorhanden, die mit der Anwendung installiert wird. Wenn diese Ressource jedoch nicht ordnungsgemäß installiert ist (z. B. weil in der Zwischenzeit eine neuere Version installiert wurde, die diese veraltete Meldung nicht mehr unterstützt), wird im Ereignisprotokoll nur eine Standardmeldung angezeigt, für die nur ein ausgefallener Wortlaut angezeigt wird
und in keiner Weise mehr hilfreich.
quelle
Die beiden wichtigsten Fragen, die Sie vor der Auswahl zwischen Text und Binär stellen sollten, sind:
Eine verbreitete Meinung ist, dass das Publikum einer Protokollnachricht ein Mensch ist. Dies ist offensichtlich keine perfekte Annahme, da es dort viele Crawlerskripte gibt, die jedoch häufig vorkommen. In diesem Fall ist es sinnvoll, die Informationen in einem Medium zu vermitteln, mit dem der Mensch vertraut ist. Text hat eine lange Tradition als Medium.
Wie für den Inhalt, die Ansicht , dass ein binäres Protokoll muss ein gut definiertes Format hat. Das Format muss so gut definiert sein, dass andere Benutzer Software schreiben können, die mit diesen Protokollen arbeitet. Einige Protokolle sind recht gut strukturiert (Ihre Frage enthält mehrere). Andere Protokolle müssen in der Lage sein, Inhalte in einer weniger genau definierten natürlichen Sprachform zu übermitteln. Solche Fälle in natürlicher Sprache passen schlecht zu Binärformaten.
Für die Protokolle, die in Binärdateien beschrieben werden könnten, müssen Sie eine Auswahl treffen. Da Text für alle Benutzer geeignet ist, wird er häufig als Standardeinstellung angesehen. Wenn Sie Ihre Ergebnisse in Textform protokollieren, können Benutzer mit Ihren Protokollen arbeiten. Es wurde tausendfach bewiesen. Binärdateien sind schwieriger. Infolgedessen kann es sein, dass Entwickler Text einfach ausgeben, weil jeder weiß, wie sich das verhalten wird.
quelle
TL; DR: Die Größe spielt keine Rolle, die Benutzerfreundlichkeit jedoch
Zunächst einmal ist der Vergleich der jeweiligen Vorteile von Text- und Binärformaten für die Kurzzeitspeicherung von Protokollen eine wichtige Frage, die Größe spielt jedoch keine Rolle. Die zwei Gründe dafür sind:
Protokolle sind hochredundante Informationen, die sich sehr gut komprimieren lassen. Nach meiner Erfahrung werden komprimierte Protokolldateien nicht selten angezeigt, deren Größe 5% oder weniger der Größe der Originaldatei entspricht. Folglich sollte die Verwendung eines Text- oder Binärformats keinen messbaren Einfluss auf die Langzeitspeicherung von Protokollen haben.
Unabhängig vom gewählten Format füllen Protokolle eine Serverfestplatte schnell, wenn keine „Protokolldateisenke“ implementiert wird, die Protokolldateien komprimiert und an eine Langzeitspeicherplattform sendet. Die Verwendung eines Binärformats könnte dies etwas verlangsamen, aber selbst eine Änderung um den Faktor 10 wäre nicht so wichtig.
Text im Vergleich zu binären Protokollformaten
Das Versprechen von Unix-Systemen ist, dass wir, wenn wir lernen, das Standard-Toolset für zeilenweise strukturierte Textdateien wie grep , sort , join , sed und awk zu verwenden, in der Lage sind, Prototypen für jede Aufgabe schnell zusammenzusetzen wir wollen, wenn auch langsam und grob. Sobald der Prototyp seine Nützlichkeit bewiesen hat, können wir ihn in eine wirklich ausgereifte Software verwandeln, um Leistung zu erzielen oder andere nützliche Funktionen hinzuzufügen. Dies ist zumindest nach meinem Verständnis die Essenz der Unix-Philosophie.
Anders ausgedrückt, wenn wir wahrscheinlich Behandlungen und Analysen durchführen müssen, die wir bis heute nicht herausfinden können, wenn wir nicht wissen, wer diese Analyse usw. implementieren soll, befinden wir uns in der Phase, in der Prototypen und Textformate verwendet werden sollten Protokolle sind wahrscheinlich optimal. Wenn wir wiederholt eine kleine Menge gut identifizierter Behandlungen durchführen müssen, sind wir in der Lage, ein mehrjähriges Softwaresystem für diese Analyse zu entwickeln, und es ist wahrscheinlich, dass binäre oder strukturierte Formate für Protokolle, wie relationale Datenbanken, vorhanden sind optimal.
(Vor einiger Zeit schrieb ich einen Blog-Beitrag darüber.)
quelle
Protokolldateien liegen im Textformat vor, da sie mit einem beliebigen Texteditor oder durch Anzeigen des Inhalts über den Konsolenbefehl problemlos gelesen werden können.
Einige Protokolldateien sind jedoch im Binärformat , wenn viele Daten vorhanden sind. Das Produkt, an dem ich arbeite, speichert beispielsweise maximal 15000 Datensätze. Um die Datensätze auf kleinstem Raum zu speichern, werden sie binär gespeichert. Es muss jedoch eine spezielle Anwendung geschrieben werden, um die Datensätze anzuzeigen oder in ein Format zu konvertieren, das verwendet werden kann (z. B. Tabellenkalkulationen).
Zusammenfassend sind nicht alle Protokolldateien im Textformat. Das Textformat hat den Vorteil, dass zum Anzeigen des Inhalts keine benutzerdefinierten Tools erforderlich sind. Bei vielen Daten kann die Datei im Binärformat vorliegen. Für das Binärformat ist eine (benutzerdefinierte) Anwendung erforderlich, um die Daten zu lesen und in einem für Menschen lesbaren Format anzuzeigen. Weitere Daten können in ein Binärformat gepackt werden. Ob das Textformat oder das Binärformat verwendet wird, hängt von der Datenmenge und der einfachen Anzeige des Inhalts ab.
quelle
In eingebetteten Systemen, in denen zur Laufzeit möglicherweise kein Ausgabekanal verfügbar ist, kann sich die Anwendung die Geschwindigkeitsbeschränkung durch die Protokollierung nicht leisten, da die Protokollierung den Effekt, den ich aufzeichnen möchte, häufig verändert oder maskiert Es wurde darauf zurückgegriffen, Binärdaten in ein Array oder einen Ringpuffer zu stopfen und sie entweder am Ende des Testlaufs auszudrucken oder als Raw-Datei auszugeben und einen Interpreter zu schreiben, um sie als lesbar auszudrucken. In jedem Fall möchte ich lesbare Daten erhalten.
Warum sollten Sie in Systemen mit mehr Ressourcen Schemata erfinden, um das zu optimieren, was nicht optimiert werden muss?
quelle
Protokolldateien sollen das Debuggen von Problemen unterstützen. In der Regel ist der Festplattenspeicher viel billiger als die Entwicklungszeit. Protokolldateien verwenden Text, da es viele Tools zum Arbeiten mit Text gibt (z. B.
tail -f
). Sogar HTTP verwendet Klartext (siehe auch, warum wir keine Binärdateien anstelle von Text auf http senden ).Darüber hinaus ist es billiger, ein Klartext-Protokollierungssystem zu entwickeln und zu überprüfen, ob es funktioniert, leichter zu debuggen, wenn ein Fehler auftritt, und nützliche Informationen für den Fall wiederherzustellen, dass das System ausfällt und einen Teil des Protokolls beschädigt.
quelle
Eine beschädigte Textdatei kann immer noch um den beschädigten Teil gelesen werden. Eine beschädigte Binärdatei kann möglicherweise wiederhergestellt werden, möglicherweise jedoch auch nicht. Selbst wenn es wiederherstellbar ist, würde es einiges mehr Arbeit erfordern. Der andere Grund ist, dass ein binäres Protokollierungsformat es weniger wahrscheinlich macht, dass während eines Ansturms zum Erstellen einer "temporären Korrektur" (auch als "die dauerhafteste aller Korrekturen" bezeichnet) die Protokollierungslösung anstelle von etwas verwendet wird, das schneller erstellt werden kann.
quelle
Wir zählen auf Unit-Tests, um die Robustheit unserer Software zu erreichen und aufrechtzuerhalten. (Der Großteil unseres Codes wird auf einem Server ohne Kopf ausgeführt. Die Analyse von Protokolldateien nach dem Betrieb ist eine wichtige Strategie.) Nahezu jede Klasse in unserer Implementierung führt eine Protokollierung durch. Ein wichtiger Teil unserer Unit-Tests ist die Verwendung von "Mock" -Loggern, die bei Unit-Tests verwendet werden. Ein Komponententest erstellt einen Scheinlogger und stellt ihn dem zu testenden Objekt zur Verfügung. Es analysiert dann (wenn sinnvoll / angebracht), was protokolliert wurde (insbesondere Fehler und Warnungen). Die Verwendung eines textbasierten Protokollformats erleichtert dies aus den gleichen Gründen wie Analysen von "echten" Protokollen erheblich: Es stehen Ihnen weitere Tools zur Verfügung, die schnell verwendet und angepasst werden können.
quelle
Historisch gesehen waren Protokolle offizielle, handgeschriebene und fortlaufende Aufzeichnungen von Ereignissen. Als Maschinen in der Lage waren, Ereignisse aufzuzeichnen, wurden diese auf ein gedrucktes Ausgabegerät wie einen Fernschreiber geschrieben, der eine permanente sequenzielle Aufzeichnung erzeugte, aber nur Text verarbeiten und gelegentlich eine GLOCKE läuten konnte ...
quelle
In meinen Mainframe-Tagen verwendeten wir ein benutzerdefiniertes binäres Protokollformat. Der Hauptgrund war nicht, Platz zu sparen, sondern weil wir wollten, dass das Protokoll einen begrenzten Platz einnimmt, indem alte Einträge durch neue überschrieben werden. Das letzte, was wir wollten, war, Probleme zu diagnostizieren, die durch die Auslastung der Festplatten verursacht wurden (1980 kostete der Festplattenspeicher 1000 USD / MB, sodass die Leute nicht mehr kauften, als sie brauchten).
Jetzt gefällt mir immer noch die Idee einer kreisförmigen Protokolldatei, und wenn Betriebssysteme solch ein Biest anbieten, würde ich sie ohne zu zögern verwenden. Aber binär war eine schlechte Idee. Sie möchten wirklich keine Zeit damit verschwenden, die richtigen Befehle zum Entschlüsseln einer Protokolldatei zu finden, wenn Sie ein kritisches Problem zu lösen haben.
quelle