jak zaimplementować logrotate w skrypcie powłoki


12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Chcę zaimplementować Logrotate, aby kontrolować rozmiar pliku dziennika, więc jak zaimplementować Logrotate, jeśli sytuacja jest taka jak powyżej?

Odpowiedzi:


11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Usunąłem znaki „&”, ponieważ może to powodować problem.


@ Veerendra musimy umieścić logikę toczenia dzienników wewnątrz pętli, gdy prowadzisz nieskończoną pętlę ..
ciekawy

@ Veerendra my mój poprzedni post miał błąd .. „mv” nie utworzy nowego pliku, ale możesz zmienić skrypt zgodnie z własnymi wymaganiami.
ciekawy

Czy zamiast cpi mvczy mogę usunąć plik dziennika, to czy będzie to nowy plik dziennika o tej samej nazwie? (Moje wymaganie jest takie, że jeśli plik dziennika osiągnie określony limit, chcę usunąć ten plik dziennika, a następnie utworzyć nowy plik )
Veerendra Kakumanu

Należy użyć >>do dołączenia do pliku dziennika, >będzie on zastępować go w kółko.
alcik

jeśli używam >, dostaję tail: test.log: file truncated Hello World!.... Jeśli używam >>, otrzymuję prawidłowy komunikat w dzienniku, ale rozmiar pliku rośnie. Brak warunku sprawdzającego warunek ... ;-(
Veerendra Kakumanu

24

co powiesz na używanie savelog?

Jest dostępny w wersji debian i RH i praktycznie w każdej innej dystrybucji Linuksa, którą znam. Jest to skrypt powłoki / bin / sh, więc powinien działać również na każdym innym Uniksie.

np. przed napisaniem czegokolwiek do test.loguruchomienia savelog -n -c 7 test.log. Pozwoli to zachować 7 najnowszych niepustych wersji test.log. Domyślnie kompresuje obrócone dzienniki (ale można to wyłączyć za pomocą -l).

W razie potrzeby możesz sprawdzić rozmiar test.logi tylko savelogjeśli jest większy niż określony rozmiar.


Masz pomysł, który pakiet zawiera ten pakiet na AWS Linux (jak sądzę, blisko CentOS)? Domyślna instalacja nie ma zapisu. Nie mogę go znaleźć od yum, używając domyślnych
repozytoriów

Savelog nie znaleziono w RHEL 5. Czy wiesz, w którym repozytorium powinien on być?
Felipe Alvarez

nie mam pojęcia o pakietach centos lub rhel5, ale /usr/bin/savelogskrypt powłoki można znaleźć pod adresem sources.debian.net/src/debianutils/4.7
cas

2
Nie znalazłem savelogżadnego z moich urządzeń RHEL / CentOS 5/6, więc właśnie pobrałem go ad hoc i wydaje się, że działa dobrze dla moich potrzeb.
Dale Anderson

Jedną wadą savelogjest to, że zmienia nazwę pliku, ale zanim skończą, gzipowanie starych zajmuje dużo czasu. Tymczasem dziennik .0 zawiera już wpisy na kolejne dni. Idealnie czas między obrotem kłody a sygnalizacją procesu ponownego otwarcia kłody powinien być minimalny. Z savelogtego powodu wyłączam funkcję kompresji.
rustyx

2

W ten weekend napisałem logrotę . Prawdopodobnie nie zrobiłbym tego, gdybym przeczytał świetną odpowiedź namultilog @ JdeBP .

Skoncentrowałem się na tym, że jest lekki i jest w stanie bzip2 swoich fragmentów wyjściowych, takich jak:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Jednak jest jeszcze wiele do zrobienia i przetestowania.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.