Beenden Sie die Protokollierung in Dateien. Aber welches System soll man wählen?

Das Loggen in Dateien funktioniert seit der Unix-Epoche 1970.

Ich denke, es ist Zeit für eine Veränderung.

Meine Gründe:

  • Das Drehen von Dateien ist ein Problem: Der Server muss nach dem Drehen neu geladen werden ...
  • Das Protokollieren strukturierter Daten bedeutet diesen Workflow:
    • schöne High-Level-Datenstrukturen werden zu einer Bytefolge serialisiert
    • später muss die Bytefolge wieder zu einer schönen Datenstruktur auf hoher Ebene aufgebaut werden. Kann brechen, wenn zwei Prozesse dieselbe Datei protokollieren.
  • Ja, grep ist für die meisten Fälle gut geeignet. Komplexe Abfragen (die sich über mehrere Zeilen erstrecken) sind jedoch schwierig.

Aber was soll man wählen?

Mein Umfeld:

  • Linux-Server
  • Hauptsächlich Python-Software
  • Satellitensysteme:
    • Unsere Software läuft in Intranets von Kunden.
    • Der Satellit läuft eigenständig, wird aber von unserer Zentrale verwaltet
    • Die Netzwerkverbindung zwischen Satellit und Zentrale ist manchmal langsam oder ausgefallen.

Anforderungen

  • Netzwerkausfälle zwischen Satellit und Zentrale können täglich passieren. Eine Art Pufferung ist erforderlich
  • grep-replacement: Wir brauchen eine einfache Möglichkeit, die Protokolle von der Shell (auf Satellit und Zentrale) zu „grep“
  • Strukturdatenunterstützung: Wir müssen in der Lage sein, strukturierte Daten (json oder yaml) zu protokollieren
  • Unterstützung für Python virtualenvs: Wir betreiben mehrere virtualenvs auf einem Linux-Server. Protokolle müssen von jeder virtuellen Umgebung getrennt aufbewahrt werden

Antworten (2)

Möglicherweise können Sie Folgendes verwenden: https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-14-04

Logstash leitet die Logs an den zentralen Logging-Server weiter.


Außerdem kann rsyslog so konfiguriert werden, dass es an einen zentralen Speicher weiterleitet und Protokolle mit der folgenden Konfigurationseinstellung lokal zwischenspeichert:

$WorkDirectory /rsyslog/work # Standardspeicherort für Arbeitsdateien (Spooldateien) Durch erweiterte Konfiguration kann es sogar so konfiguriert werden, dass es sich bei einem MySQL-Server anmeldet. Die Konfiguration kann komplexe Einträge erzeugen.

Möglicherweise möchten Sie sich aus folgenden Gründen in SQLite-Datenbanken anstelle von Nur-Text-Dateien anmelden:

  • SQLite ist Teil der Python-Standardlaufzeitbibliothek. So lassen sich Datenbanken sehr einfach erstellen, befüllen und pflegen
  • Die binäre Distribution besteht aus einer einzelnen (skriptfähigen) ausführbaren Befehlszeilendatei, der SQLite-Shell, die zum einfachen Abfragen der Protokolle verwendet werden kann
  • sqlite bietet einen Sperrmechanismus, der verhindert, dass Dateien durch einen gleichzeitigen Schreibzugriff beschädigt werden
  • JSON- und YAML-Daten könnten entweder serialisiert und als Text gespeichert werden (SQLite erlaubt eine Textfeldgröße von 2 31 -1 Bytes) oder wenn die Struktur in ihrer Größe begrenzt und über Protokolleinträge hinweg konsistent ist, könnten die Datenbanktabellen entsprechend strukturiert werden
  • Das Abfragen der Datenbanken mit Hilfe von SQL kann viel schneller und bequemer sein als die Verwendung von grep für Textdateien. SQLite implementiert auch eine indizierte Volltextsuche, um die Suche nach Zeichenketten zu beschleunigen
  • Der Bedarf an Protokollrotation wurde stark verringert: Die theoretische maximale Anzahl von Zeilen in SQLite-Datenbanken (die einer Anzahl möglicher Protokolleinträge entspricht) beträgt 2 64 . Auch ohne Log-Rotation lassen sich aktuelle Einträge schnell abfragen, wenn der Zeitstempel explizit als Feld in die Tabellen integriert wird

Die Empfehlung wäre, für jede virtuelle Umgebung eine separate lokale SQLite-Datenbank zu verwenden. Die Protokolle könnten dann vom Satelliten gesammelt werden. Sobald das Netz verfügbar ist, kann die Satellitendatenbank von der Zentrale abgefragt werden. Alternativ können Satellit und Zentrale auch jedes andere RDBMS zum Integrieren von Daten verwenden (im Allgemeinen enthalten Datenbankverwaltungssysteme auch einen Befehlszeilenclient zum Verwalten oder schnellen Abfragen - oder wie Sie es genannt haben - "Greppen" der Datenbank).

Zugegeben, es gibt einige Einschränkungen:

  • Schreibleistung: kann ein Problem sein, wenn Einträge sehr schnell generiert werden und jeder in einer separaten Transaktion in die DB gehen soll. In diesem Fall kann man nur wenige Dutzend Einträge pro Sekunde schreiben. Andernfalls, wenn man mehrere Einträge in einer Transaktion kombinieren kann, ist dies ein weitaus kleineres Problem (siehe https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite )
  • Die maximale Größe der SQLite-Datenbank kann eine Einschränkung darstellen: Wenn das generierte Datenvolumen sehr hoch ist, ist die Begrenzung der Datenbankgröße von ~ 140 TB nicht weit entfernt. In diesem Fall würde man ein System mit mehr Kapazität bevorzugen, wenn die Rotation vollständig vermieden werden soll. Für einen Vergleich verschiedener RDBMS siehe https://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems#Limits
Ich möchte selbstgemachte Lösungen vermeiden. SQLite ist eine großartige Datenbank. Doch zur Lösung fehlen noch viele Dinge: Welches Datenbankschema wäre sinnvoll? Wie bekomme ich die Log-Meldungen in die Datenbank ...