Ludzie, czy istnieje rozwiązanie * nix, które sprawiłoby, że plik dziennika działałby jak bufor cykliczny? Na przykład chciałbym, aby pliki dziennika przechowywały maksymalnie 1 GB danych i odrzucały starsze wpisy po osiągnięciu limitu.
Czy to w ogóle możliwe? Uważam, że aby to osiągnąć, plik dziennika powinien zostać przekształcony w jakieś specjalne urządzenie ...
PS Zdaję sobie sprawę z różnych narzędzi do logrotowania, ale nie tego potrzebuję. Logrotowanie wymaga wielu operacji wejścia / wyjścia, zwykle dzieje się to raz dziennie, podczas gdy potrzebuję rozwiązania „runtime”.
tail -f somefile
Zrobiłby tego. Właśnie próbowałem z obróconymi dziennikami itail -f
nie działa z nimi.Odpowiedzi:
Linux ma bufor pierścieniowy jądra. Możesz go użyć
dmesg
do wyświetlenia .Lub tutaj jest moduł jądra Linuksa, który wydaje się robić to, co chcesz.
źródło
Najbliższa rzecz, o której mogę myśleć, to RRDTools, ale prawdopodobnie nie jest to, czego szukasz. Innym rozwiązaniem byłoby monitorowanie pliku dziennika (powiedz co sekundę lub w systemie Linux z inotify), np. Piszesz skrypt taki jak:
z inotify:
źródło
Można użyć multilog z daemontools DJB za. Pipujesz do niego dane wyjściowe z dziennika . Tak, to rotacja logów, ale rotacje to po prostu:
Co w prawie każdym nowoczesnym systemie plików linux jest super szybką operacją. Możesz określić, ile chcesz plików dziennika, jak duże chcesz. zrób 10 x 1024mb plików, a będziesz miał swój bufor 1GB.
Zauważ, że z powodu automatycznego obracania jest to jedno źródło na instancję multiloga. Możesz jednak obejść ten problem, pisząc proste opakowanie za pomocą netcata lub ręcznie.
źródło
Możesz utworzyć potok FIFO, a następnie odczytać go za pomocą skryptu wstawionego do bazy danych. Gdy licznik osiągnie 1000, zrestartuj numer identyfikacyjny wstawiany do bazy danych. Oczywiście nie działałoby to dla wielkości, ale wykorzystałeś to jako przykład, więc zakładam, że jest to pytanie teoretyczne.
źródło
Interesujące pytanie; zwykle nie widzisz tego jako projektu. Mam program, który używa nieco podobnej techniki do zapisywania historii, ale używa formatu binarnego. „Plik dziennika” składa się z czterech części, wszystkie ułożone w formacie niezależnym od maszyny:
Przydzielenie nowego rekordu, jeśli na wolnej liście jest miejsce, oznacza to, że nadpisuje tam wpis (niekoniecznie wykorzystując wszystko - w takim przypadku fragment pozostaje na wolnej liście). Jeśli na liście wolnych nie ma miejsca, na końcu przydzielane jest nowe miejsce. Kiedy stary rekord się obraca, jego miejsce jest przenoszone do wolnej listy i łączone z dowolnymi sąsiednimi wolnymi rekordami. Jest przeznaczony do obsługi instrukcji SQL, dzięki czemu rekordy można rozłożyć na wiele wierszy. Ten kod działa na określonej liczbie rekordów. Nie ogranicza rozmiaru pliku jako takiego (choć nie byłoby to trudne).
Główny kod historii kodu znajduje się w dwóch plikach, history.c i history.h, dostępnych ze źródła dla programu SQLCMD (moja wersja, nie Microsoft; moja istniała dziesięć lat lub dłużej przed Microsoft), którą można pobrać z archiwum oprogramowania International Informix User Group . Istnieje również program zrzutu pliku historii (histdump.c) i tester historii (histtest.ec - twierdzi, że jest to ESQL / C, ale sam w sobie jest kodem C; jedna z funkcji pomocniczych, które wywołuje, używa niektórych Informix ESQL / C funkcje biblioteki). Skontaktuj się ze mną, jeśli chcesz eksperymentować bez używania Informix ESQL / C - zobacz mój profil. Istnieją pewne trywialne zmiany, aby kompilować histstest poza środowiskiem projektowym, a ponadto potrzebujesz makefile.
źródło
Zgadzam się z komentarzem pehrsa do twojego pytania. Rotacja kłód nie jest taka trudna. Możesz skonfigurować program logrotate lub inny skrypt, aby okresowo sprawdzał plik dziennika, nawet tak często, jak co minutę, jeśli chcesz. Gdy wykryje, że Twój plik osiąga rozmiar 1 GB, po prostu wykonuje zmianę nazwy, która nie ma prawie żadnego wejścia / wyjścia. Podczas zmiany nazwy proces kontynuuje zapisywanie pliku dziennika. Rotator dziennika można następnie wysłać HUP do demona syslog (demon jest zalogowaniu przez syslog, prawda? Jeśli nie, należy go obsługiwać sygnał HUP, czy to dobrze napisane ...), aby go ponownie otworzyć oryginalną ścieżkę . W tym momencie rozpocznie zapisywanie do nowego pliku na oryginalnej ścieżce i możesz usunąć obróconą wersję.
źródło