Specjalny plik, który przechowuje tylko ostatnie n linii

0

Czy istnieje sposób na utworzenie specjalnych plików pod Linuksem, które zachowałyby tylko, powiedzmy 100 ostatnio napisanych linii? Mam proces wypełniania pliku dziennika i chciałbym regularnie analizować jego 100 ostatnich wierszy.

Wiem, że mógłbym użyć jakiegoś logrotatu, ale czy istnieje sposób na utworzenie specjalnego pliku, który wypełniałby się aż do osiągnięcia 100 wierszy, a następnie dodanie wiersza usuwa najstarszy, aby plik zachował tylko 100 wierszy? (rodzaj FIFO opartego na linii)

Wielkie dzięki

Daladim
źródło
2
tailrobi to, abyś mógł napisać zadanie cron, aby wypełnić plik w dowolnym interwale odświeżania, jaki chcesz. po prostu nadpisz tail <file> > <targetfile>. jeśli częstotliwość odświeżania jest wystarczająco wysoka, będzie działać jak bufor FIFO.
Frank Thomas
1
Fajnie byłoby mieć niestandardowy wirtualny system plików, w którym można catuzyskać pochodne treści (takie jak bufor pierścieniowy), ale nie są one zbyt popularne. Są to tak zwane systemy plików o strukturze dziennika. Byłoby idealne dla tego scenariusza. en.wikipedia.org/wiki/Log-structured_file_system . Na razie sugeruję, abyś napisał skrypt, który wykonuje dla siebie tail -n 100.
David Betz
Dzięki, nie wiedziałem o takich systemach plików! Ideałem byłyby specjalne pliki, które działają jak takie bufory pierścieniowe (które pozwoliłyby uniknąć konieczności instalowania i montowania całego FS, a myślałem, że główne dystrybucje Linuksa już to obsługują). Na pewno skończę tail, ale cieszę się, że się czegoś nauczyłem :)
Daladim
Ogólnie istnieje sposób na tworzenie plików, które są dokładnie takie, jakie mają być: niestandardowy FUSE (system plików w przestrzeni użytkownika). Nie jest to tak łatwe, jak się spodziewałeś, ale jest możliwe.
Kamil Maciorowski

Odpowiedzi:

0

Dzienniki są plikami tekstowymi (podobnymi) i dlatego takie dodawanie do nich nowych bloków dysku, gdy wymagają tego nowe linie, jest szybką akcją obsługiwaną przez dowolny system plików.

Jednak ciągłe porzucanie pierwszego wiersza, gdy nadchodzi nowy, oznaczałoby reorganizację przynajmniej niektórych, jeśli nie wszystkich bloków pliku STAŁO. Oznaczałoby to duży narzut związany z logowaniem, podczas gdy jedną z najważniejszych cech, które chcemy rejestrować, jest to, że jest lekki.

Systemy plików nie są na to przygotowane (przynajmniej nie słyszałem o tym typie), dlatego właśnie logowanie wspierane przez logrotate / tail / database jest używane tam, gdzie ważne są ostatnie rekordy.

Gombai Sándor
źródło
Dzięki za tę wskazówkę niskiego poziomu, o której nie myślałem :)
Daladim
0

Zakładając, że masz skrypt, który przetwarza tylko 100 ostatnich wierszy za każdym razem, gdy jest uruchamiany, te wiersze najlepiej przechwycić za pomocą tailpolecenia, ponieważ robi to właściwie to, co chcesz zrobić. Kluczem jest tutaj -nprzełącznik, który określa, ile linii powinien przechwycić, zaczynając od końca.

Możesz bezpośrednio wykonać skrypt tail -n 100 somefile.logw skrypcie lub możesz okresowo uruchamiać tail -n 100 somefile.log > onlylast100lines.logplik, który zawiera tylko ostatnie 100 wierszy. To drugie podejście przepisuje plik docelowy za każdym razem, więc nie trzeba go usuwać między każdym uruchomieniem.

Jarmund
źródło
Byłem świadomy tail(i w końcu z niego skorzystam), ale z ciekawości chciałem wiedzieć, czy istnieją funkcje Linuksa, o których nie wiedziałem, że to zadziała. W każdym razie dzięki.
Daladim
0

Opracowując metodę Jarmunds, możesz stworzyć skrypt bash w następujący sposób:

while true; do 
    tail -n 100 somefile.log > onlylast100lines.log
    sleep 5
done

Spowoduje to parsowanie ostatnich 100 wierszy pliku somefile.log do onlylast100lines.log co 5 sekund. Plik byłby nadpisywany za każdym razem, więc zawsze będzie to tylko ostatnie 100 wierszy. Można to dodać do skryptu logowania lub do dowolnego poziomu uruchamiania, który ma być wykonywany.

Mikkel Bue Tellus
źródło
Byłem świadomy tail(i w końcu z niego skorzystam), ale z ciekawości chciałem wiedzieć, czy istnieją funkcje Linuksa, o których nie wiedziałem, że to zadziała. W każdym razie dzięki.
Daladim