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 0normalne 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, INFOi ERRsą najczęściej używane. Sprawdź man 3 syslogdostę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_LOCAL0od 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
.infoCzęść local1.infoPowyższe oznacza, że wszystkie wiadomości, które są INFOlub 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_LOCALlub rsyslogfiltrze.
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/ fopeni write/ printf.