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 0
fü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
, INFO
und ERR
die am häufigsten verwendet wird. Sehen Sie man 3 syslog
fü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_LOCAL0
bis 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.conf
z
local1.info /var/log/programname.log
und Neustarten des Syslog-Servers, z
pkill -HUP syslogd
Der .info
Teil von local1.info
oben bedeutet , dass alle Nachrichten , die sind INFO
oder noch wichtiger werden protokolliert, einschließlich INFO
, NOTICE
, ERR
(Fehler), CRIT
(kritisch), etc., aber nicht DEBUG
.
Oder wenn rsyslog
ja, 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_LOCAL
oder einen rsyslog
Filter 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 syslog
schreiben, 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
/ fopen
und write
/ printf
-Aufrufe verwende.