Logging unter Linux mit C++



  • Hallo!

    Ich wollte meiner derzeitigen Log-Klasse gerne endlich die Möglichkeit geben die Log-Informationen nach /var/log zu schreiben. Jedoch stehe ich jetzt vor einer Design-Frage:

    Wie schreibt man am schnellsten und vollständigsten eine Log?

    Dabei ist mir wichtig, dass das Schreiben der Log nicht den Programmablauf stark beeinträchtigt und außerdem bei einem Absturz des Programmes keine Informationen verschluckt.

    In meinem Kopf haben sich jetzt mehrere Ideen zusammengesetzt.

    Idee 1: Man öffnet die Log-Datei jedes mal im APPEND-Modus.
    Ist vermutlich sehr ineffizient und kostet Zeit. Dafür werden niemals Daten verschluckt.

    Idee 2: Man öffnet die Log-Datei einmal und arbeitet mit fflush.
    Schneller als Idee 1, würde aber das Programm beeinträchtigen, wenn die Festplatte mal durch andere Anwendungen busy ist?! Vermutlich?! Außerdem kann nur eine Anwendung in die Log-Datei schreiben.

    Idee 3: Man legt einen Thread für Idee 1/2 an
    Dabei können allerdings vermutlich bei einem Absturz Log-Informationen verloren gehen die noch im Stack liegen.

    Idee 4: Man legt einen extra-Prozess an und arbeitet über eine PIPE (FIFO)
    Würde vermutlich die Probleme mit der Performanche und dem verloren-gehen von Daten am besten lösen, da die Pipe im Speicher liegt und der Extra-Prozess die Schreibarbeit übernimmt.
    Gibt es dafür schon eine empfehlenswerte Anwendung (syslog?) oder müsste man sich die selber schreiben?
    Wobei eine selbstgeschriebene Anwendung noch überprüfen könnte, ob das Programm abgestürzt ist und im Notfall die Anwendung neustarten (wie es bei mir gewünscht wäre)

    Gibt es irgendwelche Ratschläge für eine gute Logging-Lösung?!

    Danke im voraus für jede Idee 🙂



  • Hallo,

    also ich habe mir eine kleine Log-Api gebaut, die ich in jedem von meinen Programmen verwende. Hier mal die derzeitigen Features:

    • verschiedene Log-Modis {ERROR, STATUS, INFORMATION, DEBUG}
      verschiedene Modis werden im Release nicht geloggt, somit kann ich mein Code für Debugging zwecke zupflastern.
    • Loglevel beschreibt wie stark das Logging ist
    • Eingebaute Logrotate, damit man nicht eine Woche lang in das selbe File schreibt
    • Thread-Safe
    • Schnelle initialisierung und verwendung damit man nicht ewig viel schreiben muss nur um was zu loggen. Bei mir ist die Log Klasse ein Singleton-Objekt welches auf dem Heap liegt.

    Geplant ist noch shift Operatorüberladung damit das logging noch schneller geht, wobei schneller, weniger schreibarbeit bedeutet...

    Ich persönlich finde es extrem lästig wenn ich was loggen will und viel code schreiben muss oder ein Objekt erstellen muss nur um was zu loggen.

    Ich logge nicht in syslog, ich habe unter /var/log/<program>/ meine files liegen.

    Hoffe das hilft dir etwas weiter.
    PS ich abeite im append mode der datei und habe keine Probleme.

    so long
    jd



  • Ja, Idee 1 ist sehr ineffizient und bist du dir sicher, dass damit mehrere Prozesse gleichzeitig sicher in die Datei schreiben können? Dafür müsste es ja ein atomares seek_to_end_and_write geben. Mag ja sein, aber wenn nicht, seh ich schwarz. In beiden Fällen dann doch lieber Idee 4.
    Idee 2 ist performant und am vernünftigsten, denke ich. Das bremst auch nicht aus, fflush ist ja kein fsync. fflush wird bei Einsatz von write nicht einmal nötig sein (gilt vmtl. auch für fwrite).
    Bei Idee 3 kann man eigene Signalhandler bauen, die den Thread vor dem Abschied noch korrekt beenden. Ist aber ein furchtbares Gefrickel, würde ich nicht machen.




Anmelden zum Antworten