Zachowaj stały rozmiar pliku dziennika bez logrotate

13

Czy jest jakiś sposób na utrzymanie stałej wielkości pliku dziennika bez obracania go o nowy pusty plik i usuwania (lub archiwizowania) starego pliku. Na przykład, jeśli ustawię maksymalny rozmiar pliku dziennika na 1 MB, po zwiększeniu rozmiaru pliku powyżej tego limitu zostanie on automatycznie zaciśnięty, tekst zostanie dodany na „ogonie”, a najstarsza część tekstu zostanie wyświetlona, ​​aby zachować rozmiar pliku 1 MB .

uray
źródło
użyj logrotate, a następnierm -f *.tar.gz.*
Marco Ceppi
1
Czy istnieje jakiś szczególny powód, dla którego nie chcesz obracać dziennika ani używać logrotate? Dokładnie co chcesz się wydarzyć? Zarchiwizować stary dziennik w 1M i rozpocząć nowy? Początek pytania nie jest do końca zgodny.
David Thornley,
co oznacza wyskoczyło ?
tshepang

Odpowiedzi:

4

Możesz napisać mały skrypt bash, aby to zrobić. Wystarczy dopasować plik do określonej liczby bajtów, używając tail -ci nadpisując plik.

z man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
jjclarkson
źródło
3
Jestem stosunkowo pewien, że po „nadpisaniu pliku” rejestrowanie nie zostanie automatycznie wznowione dla nowego pliku.
Stephen Jazdzewski
0

Jedynym rozwiązaniem może być napisanie własnego systemu plików przestrzeni użytkownika lub wniesienie wkładu do istniejącego. Spójrz na częściową listę w systemie plików w przestrzeni użytkownika

Jeśli nie masz umiejętności wnoszenia wkładu, zaoferuj promocję projektu lub $$$ lub oba, aby dodać go dla Ciebie.

Chciałbym mieć czas, aby to zrobić, zawsze chciałem czegoś dokładnie takiego.

Stephen Jazdzewski
źródło
0

Możesz zrobić coś podobnego za pomocą FIFO, który jest jak plik o rozmiarze zero bajtów.

Pamiętaj jednak, że jeśli z tego pliku nic NIE CZYTA, proces syslog może zostać zablokowany i przestanie zapisywać do WSZYSTKICH plików dziennika. Nie jestem pewien, czy to zachowanie zostało zmienione w nowszych wersjach Ubuntu / CentOS.

Jeden przykład tutaj

Na inny przykład spróbuj czegoś takiego.

Zrób swój FIFO:

sudo mkfifo /var/log/everything.fifo

I dodaj to do (r) syslog.conf, a następnie uruchom ponownie syslog:

*.*     |/var/log/everything.fifo

Następnie wyświetl FIFO z jednego okna:

cat /var/log/everything.fifo

A w innym oknie wyślij kilka rzeczy do syslog:

logger Test1
logger Test2
logger Test3

Powinieneś zobaczyć linie „Test *” na wyjściu catpowyżej.

Ta funkcja może być świetna do debugowania, szczególnie jeśli nie zależy ci na dłuższym przechowywaniu danych. Na przykład, jeśli chcesz zobaczyć wszystko oprócz spamu firewall, możesz zrobić coś takiego:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
Stefan Lasiewski
źródło
0

Oto moja druga odpowiedź. To jest dość hackerskie.

Użyj watch (1), aby wielokrotnie wykonywać tail --bytes=1024(ostatnie 1024 bajty pliku dziennika, dzięki @jjclarkson za tę odpowiedź).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

A następnie wyświetl plik za pomocą:

less --raw-control-chars /tmp/messages.watch

Różnica między watchpętlą a watchchwilą polega na tym , że aktualizuje /tmp/messages.watch tylko, jeśli nastąpiły zmiany w / var / log / messages.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Cóż, myślę, że możesz umieścić testpętlę while, aby ogon był wykonywany tylko, jeśli zaktualizowano / var / log / messages, ale teraz tego nie rozgryzę.

Stefan Lasiewski
źródło
0
 * przycinać - wycina wierzchołki listy plików opisanych w
 * plik / etc / default / prune. Zaprojektowany do okresowego uruchamiania
 * z crona chodzi o automatyczne skrócenie dziennika
 * pliki, które rosną na zawsze. Ten plik zawiera listę
 * pliki (pełna nazwa ścieżki) i liczba bloków, które
 * należy zachować. Aby zachować zdrowie psychiczne, śliwka to zrobi
 * przyciąć plik po następnej nowej linii. Plik
 * / etc / default / prune powinien wyglądać mniej więcej tak:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * Wpis crontab na infoswx dla śliwek wygląda następująco:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> i 1
 *
 * Kompiluj z: cc -O -o prune prune.c
 *
 * Poniższe definicje można dostosować do własnych upodobań
 * i rozmiar bloku systemu.
 *
 * Ray Davis infoswx! Bees 09/25/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=pl&ie=UTF-8&q=prune+log+file&pli=1

Wiele demonów (większość? Wszystkich?) Ponownie otworzy swoje pliki dziennika, jeśli zostanie wysłany sygnał HUP (np. Przez to samo zadanie cron, które uruchamia przycinanie)

RedGrittyBrick
źródło
0

Jestem pewien, że oryginalny plakat znalazł rozwiązanie po 8 latach. Oto kolejny dla innych, którzy mogą przeczytać ten wątek ...

ograniczenie ogranicza rozmiar danych wyjściowych programu i zachowuje ostatnie 200 MB danych wyjściowych za pomocą następującego polecenia:

Run_program | curtail -s 200M mójprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

Dave Wolaver
źródło