Der Standardweg zum Loggen aus einem C-Programm ist syslog
.
Beginnen Sie mit dem Einbinden der Header-Datei:
#include <syslog.h>
Dann sollten Sie früh in Ihrem Programm Syslog konfigurieren, indem Sie openlog
aufrufen :
openlog("programname", 0, LOG_USER);
Das erste Argument ist die Identifikation oder das Tag, das automatisch am Anfang jeder Nachricht hinzugefügt wird. Geben 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 befindet sich in man 3 syslog
. Eines, das Sie vielleicht nützlich finden, ist LOG_PID
, wodurch Syslog auch die Prozess-ID in der Protokollnachricht aufzeichnet.
Dann rufen Sie jedes Mal, wenn Sie eine Protokollnachricht schreiben möchten, syslog
auf :
syslog(LOG_INFO, "%s", "Message");
Das erste Argument ist die Priorität. Die Priorität reicht von DEBUG
(am unwichtigsten) bis EMERG
(nur für Notfälle) mit DEBUG
, INFO
, und ERR
am häufigsten verwendet werden. Siehe 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 erscheint, hängt von Ihren Syslog-Einstellungen ab.
Bei einer Standardeinstellung geht es wahrscheinlich in /var/log/messages
.
Sie können eine benutzerdefinierte Protokolldatei einrichten, indem Sie eine der Einrichtungen im Bereich LOG_LOCAL0
verwenden bis 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);
usw.
und Hinzufügen eines entsprechenden Eintrags zu /etc/syslog.conf
, z. B.
local1.info /var/log/programname.log
und Neustart des Syslog-Servers, z. B.
pkill -HUP syslogd
Die .info
Teil von local1.info
oben bedeutet, dass alle Nachrichten INFO
sind oder wichtiger werden protokolliert, einschließlich INFO
, NOTICE
, ERR
(Fehler), CRIT
(kritisch) usw., aber nicht DEBUG
.
Oder, wenn Sie rsyslog
haben , könnten Sie einen eigenschaftsbasierten Filter ausprobieren, z. B.
:syslogtag, isequal, "programname:" /var/log/programname.log
Der Syslogtag sollte ein ":" enthalten.
Oder wenn Sie vorhaben, Ihre Software an andere Personen zu verteilen, ist es wahrscheinlich keine gute Idee, sich auf die Verwendung von LOG_LOCAL
zu verlassen oder ein rsyslog
filtern.
In diesem Fall sollten Sie LOG_USER
verwenden (wenn es sich um ein normales Programm handelt) oder LOG_DAEMON
(wenn es sich um einen Server handelt), schreiben Sie Ihre Startmeldungen und Fehlermeldungen mit syslog
, aber schreiben Sie alle Ihre Protokollmeldungen in eine Datei außerhalb von syslog
. Apache HTTPd meldet sich beispielsweise bei /var/log/apache2/*
an oder /var/log/httpd/*
, nehme ich an, dass Sie den regulären open
verwenden /fopen
und write
/printf
Anrufe.
Sie werden #include <syslog.h>
wollen , dann verwenden Sie den syslog()
Funktionen, um Daten an das jeweils aktive Protokollierungsprogramm des Systems zu senden.
Sehen Sie sich die Manpage hier an.