Erstellen Sie eine Protokolldatei


22

Gibt es eine Möglichkeit, eine Protokolldatei zum Verwalten einiger Daten in / var / log / mit Hilfe einer Bibliotheksfunktion oder eines Systemaufrufs in der Sprache c unter Linux zu erstellen? Und ich möchte auch die Standards kennen, die wir zum Schreiben und Verarbeiten von Protokollen befolgen sollten. Vielen Dank


Bitte beachten Sie, dass Programmierfragen hier in der Regel nicht zum Thema gehören. Sie sollten sie auf Stapelüberlauf fragen . Eine Erklärung der API ist hier in Ordnung, aber Erklärungen zur Verwendung in C oder einer anderen Programmiersprache gehören normalerweise zu Stack Overflow.
Gilles 'SO- hör auf böse zu sein'

Antworten:


31

Die Standardmethode zum Protokollieren aus einem C-Programm ist syslog.

Beginnen Sie mit der Header-Datei:

#include <syslog.h>

Dann sollten Sie zu Beginn Ihres Programms syslog konfigurieren, indem Sie Folgendes aufrufen openlog:

openlog("programname", 0, LOG_USER);

Das erste Argument ist die Identifikation oder das Tag, das am Anfang jeder Nachricht automatisch hinzugefügt wird. Tragen Sie hier den Namen Ihres Programms ein.

Das zweite Argument sind die Optionen, die Sie verwenden möchten, oder 0für das normale Verhalten. Die vollständige Liste der Optionen finden Sie in man 3 syslog. Eine nützliche Funktion ist LOG_PID, dass Syslog auch die Prozess-ID in der Protokollnachricht aufzeichnet.

Jedes Mal, wenn Sie eine Protokollnachricht schreiben möchten, rufen Sie Folgendes auf syslog:

syslog(LOG_INFO, "%s", "Message");

Das erste Argument ist die Priorität. Die Priorität liegt im Bereich von DEBUG( am wenigsten wichtig) bis EMERG(nur für Notfälle) mit DEBUG, INFOund ERRdie am häufigsten verwendet wird. Sehen Sie man 3 syslogfür Ihre Optionen.

Das zweite und dritte Argument sind ein Format und eine Nachricht, genau wie printf.

In welcher Protokolldatei dies angezeigt wird, hängt von Ihren Syslog-Einstellungen ab.

Bei einem Standard-Setup geht es wahrscheinlich in /var/log/messages.


Sie können eine benutzerdefinierte Protokolldatei einrichten, indem Sie eine der Funktionen im Bereich LOG_LOCAL0bis verwenden LOG_LOCAL7.

Sie verwenden sie, indem Sie Folgendes ändern:

openlog("programname", 0, LOG_USER);

zu

openlog("programname", 0, LOG_LOCAL0);

oder

openlog("programname", 0, LOG_LOCAL1);

etc.

und Hinzufügen eines entsprechenden Eintrags zu /etc/syslog.confz

local1.info /var/log/programname.log

und Neustarten des Syslog-Servers, z

pkill -HUP syslogd

Der .infoTeil von local1.infooben bedeutet , dass alle Nachrichten , die sind INFOoder noch wichtiger werden protokolliert, einschließlich INFO, NOTICE, ERR(Fehler), CRIT(kritisch), etc., aber nicht DEBUG.


Oder wenn rsyslogja, können Sie einen eigenschaftsbasierten Filter ausprobieren , z

:syslogtag, isequal, "programname:"    /var/log/programname.log

Der Syslogtag sollte ein ":" enthalten.

Wenn Sie vorhaben, Ihre Software an andere Personen zu verteilen, ist es wahrscheinlich keine gute Idee, sich auf die Verwendung LOG_LOCALoder einen rsyslogFilter zu verlassen.

In diesem Fall sollten Sie LOG_USER(wenn es sich um ein normales Programm handelt) oder LOG_DAEMON(wenn es sich um einen Server handelt) Ihre Startmeldungen und Fehlermeldungen mit syslogschreiben, aber alle Ihre Protokollmeldungen in eine Datei außerhalb von schreiben syslog. Zum Beispiel meldet sich Apache HTTPd bei /var/log/apache2/*oder /var/log/httpd/*ich gehe davon aus, dass ich reguläre open/ fopenund write/ printf-Aufrufe verwende.


Danke. Dies ist eine recht nützliche Information. Aber würden Sie bitte mehr über die Option log_local0-7 erklären? Zum Beispiel. Ich möchte meine Daten (die das Wort <self> in der Protokollzeile enthalten) in die Datei self.log schreiben. und einige Protokolle in anderen Dateien.
Sushant Jain

@ Sushant Jain: Auf welche Linux-Distribution und -Version zielen Sie ab? Haben Sie alte Syslog (ksyslogd) oder rsyslog? rpm -qa | grep syslogoder dpkg -l '*syslog*'wird dir wohl sagen was.
Mikel

log_local * sind Relikte von damals, als sysklogdes das einzige Spiel in der Stadt für Syslog-Software gab. Heutzutage Software wie syslog-ng, rsyslogund dsyslogexist und haben viel komplexere Filterfunktionen als nur Service / Niveau.
Shadur

Vielen Dank. Mein Problem wurde gelöst. Ich habe noch eine Abfrage zum Parsen von Daten, die in der Protokolldatei gespeichert sind. Gibt es eine gute Möglichkeit, dies zu tun? Eigentlich versuche ich ein Systemstatistik-Tool zu machen. Also ich brauche es.
Sushant Jain

@ Sushant Jain. Froh, dass ich Helfen kann. Veröffentlichen Sie Ihre Frage zum Parsen von Protokollen als separate Frage, damit die Benutzer sie sehen und die richtigen Antworten finden können.
Mikel

2

Sie möchten #include <syslog.h>dann die syslog()Funktionen verwenden, um Daten an das aktive Systemprotokollierungsprogramm zu senden.

Siehe die Manpage hier .


Die Funktion syslog () schreibt Daten in / var / log / syslog. Ich möchte Protokolle in meine eigene Datei schreiben.
Sushant Jain

Wie Mikel weiter unten erklärt , können Sie Ihre Protokollnachrichten so kennzeichnen, dass syslog versteht, um welches Programm es sich handelt, und dann syslog so konfigurieren, dass die Protokollnachrichten Ihrer Programme in eine andere Datei geschrieben werden.
Caleb

1

Es gibt viele Möglichkeiten, was ist Ihr Plan? Benötigen Sie nur eine Option, um sich über die Befehlszeile anzumelden? Schauen Sie sich an logger(in bsdutils enthalten ). Tipp einfach:

usr@srv % logger test

und es wird so etwas in Ihrem protokollieren /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

siehe auch man logger. Abhängig von Ihrem Protokollierungs-Daemon können Sie diese Nachrichten nach bestimmten Dateien sortieren oder nach Priorität filtern.

Es gibt auch einige Lösungen für verschiedene Programmiersprachen, also sag mir bitte, was du machen möchtest ;-)


Eigentlich möchte ich es mit C-Sprache machen. und ich habe info in mikel post bekommen.
Sushant Jain

1

Das Filtern nach Programmnamen unterscheidet sich von den oben genannten rsyslogAngaben für die neuesten Versionen von (Version auf meinem Computer ist 5.8.6) wie folgt:

if $programname == 'popa3d' then /var/log/popa3d.log

Weitere Informationen finden Sie hier

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.