it-swarm.com.de

Daemon-Protokollierung in Linux

Ich habe also einen Daemon, der auf einem Linux-System läuft, und ich möchte eine Aufzeichnung seiner Aktivitäten haben: ein Protokoll. Die Frage ist, was ist der "beste" Weg, um dies zu erreichen?

Meine erste Idee ist, einfach eine Datei zu öffnen und darauf zu schreiben.

FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s\n", (char*)bar);
/* ...all done, close the file */
fclose(log);

Gibt es an sich etwas Falsches beim Logging auf diese Weise? Gibt es einen besseren Weg, beispielsweise ein in Linux integriertes Framework?

64
codemonkey

Unix hat seit langem ein spezielles Protokollierungsframework namens syslog . Geben Sie Ihre Shell ein

man 3 syslog

und Sie erhalten die Hilfe für die C-Schnittstelle dazu.

EinigeBeispiele

#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(void) {

 openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
 syslog(LOG_INFO, "A different kind of Hello world ... ");
 closelog();

 return 0;
}
100
Vinko Vrsalovic

Diese wird wohl ein sein war Pferderennen, aber ja die Syslog-Einrichtung, die in den meisten, wenn nicht allen Un * x-Derivaten vorhanden ist, ist der bevorzugte Weg. Es ist nichts dagegen einzuwenden, sich in eine Datei einzuloggen, aber es bleiben Ihnen einige Aufgaben auf den Schultern:

  • befindet sich an Ihrem Protokollierungsort ein Dateisystem zum Speichern der Datei?
  • was ist mit Pufferung (für die Leistung) vs. Flushing (um Protokolle vor einem Systemabsturz zu schreiben)
  • wenn Ihr Daemon längere Zeit läuft, was machen Sie dann mit der ständig wachsenden Protokolldatei?.

Syslog kümmert sich um all dies und um Sie. Die API ähnelt dem printf-Clan, sodass Sie keine Probleme mit der Anpassung Ihres Codes haben sollten.

21
Richard

Ein weiterer Vorteil von syslog in größeren (oder sicherheitsbewussteren) Installationen: Der syslog-Daemon kann so konfiguriert werden, dass die Protokolle an einen anderen Server gesendet werden, um dort anstelle des lokalen Dateisystems (oder zusätzlich dazu) aufgezeichnet zu werden.

Es ist viel praktischer, alle Protokolle für Ihre Serverfarm an einem Ort zu haben, anstatt sie auf jedem Computer separat lesen zu müssen, insbesondere wenn Sie versuchen, Ereignisse auf einem Server mit denen auf einem anderen Server zu korrelieren. Und wenn einer geknackt wird, können Sie den Protokollen nicht mehr vertrauen ... Wenn der Protokollserver jedoch sicher bleibt, wissen Sie, dass nichts aus den Protokollen gelöscht wurde, sodass alle Aufzeichnungen des Eindringens intakt sind.

11
Dave Sherohman

Ich spucke eine Menge Daemon-Nachrichten an daemon.info und daemon.debug aus, wenn ich Unit-Tests durchführe. Eine Zeile in Ihrer syslog.conf kann diese Nachrichten in eine beliebige Datei einfügen.

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html hat eine bessere Erklärung der C-API als die Manpage imo.

8
phreakre

Wenn Sie Threading verwenden und die Protokollierung als Debugging-Tool verwenden, sollten Sie nach einer Protokollierungsbibliothek suchen, die eine Art threadsicherer, aber nicht gesperrter Ringpuffer verwendet. Ein Puffer pro Thread mit einer globalen Sperre nur, wenn dies unbedingt erforderlich ist.

Dadurch wird vermieden, dass die Protokollierung ernsthafte Verlangsamungen in Ihrer Software verursacht, und es werden keine Heisenbugs erstellt, die sich ändern, wenn Sie die Debugprotokollierung hinzufügen.

Wenn es ein komprimiertes binäres Hochgeschwindigkeits-Protokollformat hat, das keine Zeit mit Formatvorgängen während der Protokollierung und einigen Nice-Protokoll-Analyse- und Anzeigetools verschwendet, ist dies ein Bonus.

Ich würde einen guten Code dafür angeben, aber ich habe selbst keinen. Ich will nur eins. :)

2
Zan Lynx

Wie oben erwähnt, sollten Sie in syslog nachschauen. Wenn Sie jedoch Ihren eigenen Protokollierungscode schreiben möchten, empfiehlt es sich, den Modus "a" (write append) von fopen zu verwenden.

Ein paar Nachteile beim Schreiben Ihres eigenen Protokollcodes sind: Protokolldrehungsbehandlung, Sperren (wenn Sie mehrere Threads haben), Synchronisierung (Möchten Sie warten, bis die Protokolle auf die Festplatte geschrieben werden?). Ein Nachteil von syslog ist, dass die Anwendung nicht weiß, ob die Protokolle auf die Festplatte geschrieben wurden (sie sind möglicherweise verloren gegangen).

2

Syslog ist eine gute Option, aber Sie sollten log4c in Betracht ziehen. Die log4 [etwas] -Frameworks funktionieren gut in ihren Java- und Perl-Implementierungen. Sie können aus einer Konfigurationsdatei auswählen, ob sie sich entweder bei Syslog, Console, Flat Files oder benutzerdefinierten Protokollschreibern anmelden möchten. Sie können für jedes Ihrer Module spezifische Protokollkontexte definieren und jedes Kontextprotokoll auf einer anderen, von Ihrer Konfiguration definierten Ebene protokollieren. (Trace, Debug, Info, Warnung, Fehler, Kritisch) und lassen Sie die Konfigurationsdatei von Ihrem Daemon durch Abfangen eines Signals im laufenden Betrieb erneut lesen, sodass Sie die Protokollierungsstufen auf einem laufenden Server bearbeiten können.

2
Jon Topper

Unser eingebettetes System hat kein Syslog, also debuggen die Daemons, die ich schreibe, in einer Datei mit dem "a" -Modus, ähnlich wie Sie es beschrieben haben. Ich habe eine Funktion, die eine Protokolldatei öffnet, die Nachricht ausspuckt und dann die Datei schließt (ich mache dies nur, wenn etwas Unerwartetes passiert). Ich musste jedoch auch Code schreiben, um die Protokollrotation zu handhaben, da andere Kommentatoren dies erwähnt haben. Es ist ziemlich grob und sollte vielleicht als "frontseitige Protokollabschneidung" bezeichnet werden, aber es hindert unser kleines RAM festplattenbasiertes Dateisystem daran, die Protokolldatei zu füllen.

1
MattSmith

Bisher hat niemand die boost log library erwähnt, die eine nette und einfache Möglichkeit hat, Ihre -Protokollnachrichten in Dateien oder syslog sink oder sogar Windows-Ereignisprotokoll umzuleiten.

1
alexkr

Es gibt viele mögliche Probleme: Wenn beispielsweise die Festplatte voll ist, möchten Sie, dass Ihr Daemon ausfällt. Außerdem werden Sie Ihre Datei jedes Mal überschreiben. Häufig wird eine zirkulare Datei verwendet, damit auf der Maschine Speicherplatz für Ihre Datei vorhanden ist. Sie können jedoch genügend Verlauf beibehalten, um nützlich zu sein, ohne zu viel Speicherplatz in Anspruch zu nehmen ... Es gibt Tools wie log4c, die Ihnen helfen können. Wenn Ihr Code c ++ ist, können Sie log4cxx im Apache-Projekt in Betracht ziehen (apt-get install liblog4cxx9-dev unter ubuntu/debian), aber es sieht so aus, als würden Sie C verwenden.

0
David Nehme