Standardowym sposobem logowania z programu w języku C. jest syslog
.
Zacznij od dołączenia pliku nagłówka:
#include <syslog.h>
Następnie na początku programu powinieneś skonfigurować syslog, wywołując openlog
:
openlog("programname", 0, LOG_USER);
Pierwszym argumentem jest identyfikator lub znacznik, który jest automatycznie dodawany na początku każdej wiadomości. Wpisz tutaj nazwę swojego programu.
Drugi argument to opcje, których chcesz użyć lub 0
normalne zachowanie. Pełna lista opcji znajduje się w man 3 syslog
. Przydatnym może być to LOG_PID
, że syslog zapisuje również identyfikator procesu w komunikacie dziennika.
Następnie za każdym razem, gdy chcesz napisać dziennik, wywołujesz syslog
:
syslog(LOG_INFO, "%s", "Message");
Pierwszy argument jest priorytetem. Zakresy pierwszeństwo z DEBUG
(najmniej ważne) do EMERG
(tylko w nagłych przypadkach) z DEBUG
, INFO
i ERR
są najczęściej używane. Sprawdź man 3 syslog
dostępne opcje.
Drugi i trzeci argument to format i komunikat, podobnie jak printf.
To, w którym pliku dziennika się pojawi, zależy od ustawień syslog.
Przy domyślnej konfiguracji prawdopodobnie wchodzi /var/log/messages
.
Możesz skonfigurować niestandardowy plik dziennika, korzystając z jednego z urządzeń w zakresie LOG_LOCAL0
od LOG_LOCAL7
.
Korzystasz z nich, zmieniając:
openlog("programname", 0, LOG_USER);
do
openlog("programname", 0, LOG_LOCAL0);
lub
openlog("programname", 0, LOG_LOCAL1);
itp.
i dodając odpowiedni wpis /etc/syslog.conf
, np
local1.info /var/log/programname.log
i zrestartowanie serwera syslog, np
pkill -HUP syslogd
.info
Część local1.info
Powyższe oznacza, że wszystkie wiadomości, które są INFO
lub bardziej ważne będą rejestrowane, w tym INFO
, NOTICE
, ERR
(błąd), CRIT
(krytyczna), itd., Ale nie DEBUG
.
Lub, jeśli masz rsyslog
, możesz wypróbować filtr oparty na właściwościach , np
:syslogtag, isequal, "programname:" /var/log/programname.log
Syslogtag powinien zawierać „:”.
Lub, jeśli planujesz rozpowszechniać swoje oprogramowanie wśród innych osób, prawdopodobnie nie warto polegać na użyciu LOG_LOCAL
lub rsyslog
filtrze.
W takim przypadku powinieneś użyć LOG_USER
(jeśli jest to normalny program) lub LOG_DAEMON
(jeśli jest to serwer), napisać komunikaty startowe i komunikaty o błędach za pomocą syslog
, ale zapisać wszystkie komunikaty dziennika do pliku poza syslog
. Na przykład Apache HTTPd loguje się do /var/log/apache2/*
lub /var/log/httpd/*
, jak zakładam, używając zwykłych wywołań open
/ fopen
i write
/ printf
.