utwórz plik dziennika

22

Czy jest jakiś sposób na utworzenie pliku dziennika do przechowywania niektórych danych w / var / log / przy pomocy funkcji biblioteki lub wywołania systemowego w języku c w systemie Linux? Chcę też poznać standardy, których powinniśmy przestrzegać przy pisaniu i przetwarzaniu dziennika. Dzięki

Sushant Jain
źródło
Należy pamiętać, że pytania dotyczące programowania są tutaj ogólnie nie na temat; powinieneś zapytać ich o Przepełnienie stosu . Wyjaśnienie interfejsu API jest tutaj odpowiednie, ale wyjaśnienia, jak używać go w języku C lub innym języku programowania zwykle należą do przepełnienia stosu.
Gilles 'SO - przestań być zły'

Odpowiedzi:

31

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.

Mikel
źródło
Dzięki, to bardzo przydatna informacja. Ale czy mógłbyś wyjaśnić więcej na temat opcji log_local0-7. Na przykład Chcę zapisać moje dane (które mają <self> słowo w wierszu dziennika) w pliku self.log. i niektóre logi w innych plikach.
Sushant Jain,
@Sushant Jain: Na którą dystrybucję i wersję Linuksa celujesz? Czy masz stary syslog (ksyslogd) lub rsyslog? rpm -qa | grep sysloglub dpkg -l '*syslog*'prawdopodobnie powie które.
Mikel,
log_local * to, szczerze mówiąc, relikty z czasów, gdy sysklogdbyła jedyną grą w mieście dla oprogramowania syslog. Obecnie oprogramowanie, takie jak syslog-ng, rsysloga dsyslogistnieją i mają o wiele bardziej zaawansowane funkcje filtrowania niż tylko usługi / poziom.
Shadur,
Wielkie dzięki. Mój problem został rozwiązany. Mam jeszcze jedno pytanie dotyczące analizy danych przechowywanych w pliku dziennika. Czy jest na to dobry sposób? Właściwie próbuję stworzyć narzędzie do statystyki systemu. Potrzebuję tego.
Sushant Jain
@Sushant Jain. Miło, że mogłem pomóc. Prześlij swoje pytanie dotyczące analizy dziennika jako osobne pytanie, aby ludzie mogli je zobaczyć i udzielić prawidłowych odpowiedzi.
Mikel
2

Będziesz chciał #include <syslog.h>, a następnie użyj syslog()funkcji, aby wysłać dane do dowolnego programu rejestrującego system, który jest aktywny.

Zobacz stronę podręcznika tutaj .

Caleb
źródło
Funkcja syslog () zapisuje dane do / var / log / syslog. podczas gdy chcę zapisywać dzienniki we własnym pliku.
Sushant Jain,
Jak wyjaśnia poniżej Mikel , możesz oznaczyć wiadomości dziennika w taki sposób, aby syslog wiedział, jakim jesteś programem, a następnie skonfiguruj syslog, aby zapisywał wiadomości dziennika w innym pliku.
Caleb,
1

Jest wiele możliwości, jaki masz plan? Czy potrzebujesz tylko opcji logowania z wiersza poleceń? Spójrz na logger(zawarte w bsdutils ). Po prostu wpisz:

usr@srv % logger test

i zapisze coś takiego /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

patrz także man logger. W zależności od demona logowania możesz sortować te wiadomości według określonych plików lub filtrować je według priorytetów.

Istnieją również rozwiązania dla różnych języków programowania, więc powiedz mi, co chcesz zrobić ;-)

binfalse
źródło
Właściwie chcę to zrobić za pomocą języka C. i mam informacje w postu Mikel.
Sushant Jain,
1

Filtrowanie według nazwy programu jest napisane inaczej niż to, co wspomniano powyżej, dla najnowszych wersji rsyslog(wersja na moim komputerze to 5.8.6), jak pokazano poniżej:

if $programname == 'popa3d' then /var/log/popa3d.log

Aby uzyskać więcej informacji, spójrz tutaj

suresh
źródło