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.