Chciałbym osiągnąć rotację logów nginx, które:
- działałoby bez dodatkowego oprogramowania (tj. najlepiej bez „logrotate”)
- tworzy obrócone pliki o nazwach opartych na dacie
Najlepszym podejściem jest coś, co ma PostgreSQL - tj. W zmiennej konfiguracyjnej log_filename mogę określić styl strftime% Y-% m-% d, i automatycznie zmieni on dziennik (lub czas) zmiany.
Inne podejście z apache - wysyłanie logów za pomocą potoku do programu rotatelogs.
O ile mogłem przeszukać - takie podejście nie istnieje. Wszystko, co mogę zrobić, to użyć logrotate z opcją dateext, ale ma on swój własny zestaw wad i wolałbym użyć czegoś, co działa jak | rotatelogs lub log_filename w PostgreSQL.
Odpowiedzi:
Chociaż świat jest podzielony co do tego, czy skromna nazwana fajka jest przyjacielem czy wrogiem, jest to prawdopodobnie najprostsze rozwiązanie twojego problemu. Ma kilka wad (polegających na tym, że trzeba wcześniej utworzyć rury), ale eliminuje potrzebę użycia crona i pozwala na użycie wybranego filtru rur rejestrujących.
Oto przykład użycia cronologa na
access.log
:/var/log/nginx
, więc tam też włożę fajki. Imię należy do ciebie; Dołączam.fifo
i takaccess.log
, więc mój będzie/var/log/nginx/access.log.fifo
.Utwórz nazwany potok dla pliku dziennika:
Skonfiguruj,
nginx.conf
aby skierować dziennik na właśnie utworzony potok:Zmodyfikuj skrypt init.d, aby uruchomić rejestrator dziennika nasłuchujący potoku przed uruchomieniem serwera:
Podobna komenda byłaby użyta,
rotatelogs
jeśli woliszcronolog
- zobacz ich dokumentację dotyczącą składni.Jeśli masz dystrakcję
start-stop-daemon
, powinieneś z niej skorzystać, ponieważ teoretycznie ma ona jakąkolwiek specjalną wiedzę na temat twojej platformy i się o nią troszczypkill
. Wystarczy owinąć polecenia w skrypcie, i przekazać go jako--exec
celustart-stop-daemon
w swojeinit.d/nginx
.źródło
Napisałem prosty program, dziennik danych, do dzielenia wspólnych dzienników na podstawie zarejestrowanej daty, w przeciwieństwie do bieżącego czasu systemowego, gdy program widzi linię dziennika. To może, ale nie musi być dokładnie to, co robi cronolog lub inny rozdzielacz logów, ale napisanie własnego było szybsze niż sprawdzenie, co robią inni.
Wykorzystując rok i miesiąc w zarejestrowanym żądaniu, wiersz jest następnie zapisywany w pliku lub potoku, który zawiera RRRRMM obliczony na podstawie zarejestrowanych danych. Tak, jest to nieco specyficzne dla wspólnego formatu dziennika. Pierwszy [zakłada się, że wyznacza datę. Uważaj na adresy IPv6. :)
W przypadku analizy dziennika ważne jest, aby każdy dziennik zawierał tylko żądania dla każdego odpowiedniego miesiąca, a każdy dziennik powinien być idealnie kompletny, aby uzyskać poprawne wyniki analizy. Nie wystarczy określić nazwę pliku na podstawie aktualnego czasu w rozdzielaczu dziennika, ponieważ wolne żądanie zaczynające się o 23:59:59 skończy w pliku dziennika dla niewłaściwego miesiąca.
Używam tego z nginx jako nazwany fifo, który sprawdza się przed uruchomieniem nginx. Zauważ, że w programie występuje kompromis między wykrywaniem błędów a buforowanym wyjściem, w którym dziennik danych obecnie preferuje buforowane wyjście ze względu na wydajność, więc upewnij się, że konfiguracja naprawdę działa, szczególnie podczas korzystania z potoków powłoki, aby nie stracić żadnych danych dziennika .
Kod źródłowy: http://stuge.se/datelog.c
Prześlij mi swoją opinię i oczywiście łatki!
źródło
Możesz to osiągnąć za pomocą prostego skryptu bash i crona:
Więcej informacji na temat konfigurowania crontab itp. Można znaleźć tutaj: Obracanie plików dziennika Nginx za pośrednictwem Crona
źródło
Obawiam się, że tak naprawdę nie rozumiem twojego pytania: ponieważ nginx nie obsługuje żadnej wbudowanej logrotacji, będziesz musiał wybrać coś takiego
gdzieś w /etc/cron.daily (powyższe nazwy plików należy oczywiście zakwalifikować pełnymi ścieżkami) lub zainstalować narzędzia apache2, aby mieć dostęp do rotatelogów.
źródło