Log rotacji standardowego?

53

Mam program Linux, który może zapisywać informacje na stdout i stderr.

Mam skrypt powłoki, który przekierowuje dane wyjściowe do pliku w /var/log. (Przez >>i 2>&1.)

Czy istnieje sposób na obrócenie tego pliku dziennika? (maksymalny rozmiar, a następnie przełącz się na inny plik, zachowaj tylko ograniczoną liczbę plików)

Widziałem kilka odpowiedzi, które mówią o logrotateprogramie, co brzmi dobrze, ale wydaje się, że są one również skoncentrowane na programach, które generują pliki dziennika wewnętrznie i obsługują sygnały HUP. Czy istnieje sposób, aby to działało za pomocą podstawowego skryptu przekierowania danych wyjściowych?

Miral
źródło
1
Dlaczego nie możesz po prostu zmodyfikować skryptu, który przekierowuje dane wyjściowe, aby zawierały logikę rotacji?
MaQleod
Mógłbym, gdyby ktoś mógł mi powiedzieć, jak wykryć rozmiar pliku dziennika i obrócić go spod standardowego procesu bez zakłócania tego procesu. Nie muszę używać, logrotatejeśli istnieje lepsza opcja, która brzmiała jak dogodny punkt wyjścia do dyskusji.
Miral
2
Nie musisz używać logrotate, ale użycie logrotate tylko oszczędza czas ... Zwykle nie ma większego sensu wymyślanie koła na nowo.
bubu
Dokładnie o to mi chodzi. Czy istnieje sposób, aby Logrotate działał z przekierowanym standardowym procesem trwającego procesu?
Miral

Odpowiedzi:

44

Alternatywnie, możesz przesyłać dane wyjściowe za pomocą narzędzi zaprojektowanych głównie w celu utrzymania zestawów plików dziennika o ograniczonych rozmiarach, automatycznie obracanych, takich jak:

Narzędzia do przetwarzania multilogzestawów plików dziennika formatu obejmują między innymi:

Dalsza lektura

JdeBP
źródło
1
Dzięki, multilogwygląda na to, czego potrzebowałem.
Miral
multilog wydaje się być jedynym rozwiązaniem typu plug-and-play w debianie (daemontools ma oficjalny pakiet). Ale w moim szczególnym przypadku, gdy chciałem przechowywać dzienniki na partycji fat32, obracanie nie działa, ponieważ multilog chce użyć dowiązania symbolicznego. Brak plug and play dla mnie :)
Arnout
To nie może być prawda, ponieważ multilognigdzie nie powstają ani nie wymagają dowiązań symbolicznych. Jest całkowicie neutralny w stosunku do nich.
JdeBP,
Adres URL „Nie używaj logrotate lub newsyslog w tym wieku” ma dodatkową kropkę
duyue
15

rotatelogsnarzędzie dostarczane z Apache (w binkatalogu) (patrz docs ) wykonuje wejściowe ze standardowego wejścia i obraca dziennik po pewnej ilości konkretnego czasu

BertNase
źródło
14

Jeśli możesz mieć, aby przejść do jednego ze standardowych strumieni dziennika (syslog, demon, cron, użytkownik, zabezpieczenia, poczta itp.), Możesz loggerzamiast tego użyć polecenia i potoku do niego.

echo "Hello." | logger -p daemon.info

W przeciwnym razie lepiej jest przesłać zarejestrowaną zawartość do niestandardowego programu lub skryptu, aby ją obsłużyć, lub zajrzyj do logrotatekonfiguracji.

EDYCJA: Wydaje się, że odpowiedź JdeBP zawiera to, czego możesz szukać.

Lara Dougan
źródło
2
+1 za prostotę. BTW, możesz również skonfigurować niestandardowe narzędzie (local0) zamiast standardowych (demon w twoim przykładzie)
Roger Keays
14

Miałem podobny problem i początkowo odrzuciłem Logrotate, ale okazało się, że Logrotate potrafi to zrobić dobrze, kluczową dyrektywą jest „ copytruncate ”. Z jakiegoś powodu ten termin nie pojawił się w żadnym z googlingów, które zrobiłem, więc dodaję tę odpowiedź, aby dokładnie wyjaśnić, jak go używać w tym przypadku.

Sztuką jest ten działa tylko wtedy, gdy przekierowanie odbywa się „ >> ” (dołącz) zamiast „ > ” (utwórz).

Plik konfiguracyjny (truncate.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

Program testowy (nigdy nie poddaje się). Możesz oglądać, jak wypełnia dysk i chociaż usunięcie pliku dziennika wydaje się działać, w rzeczywistości nie zwolni miejsca na dysku:

cat /dev/urandom >> /tmp/temp.log

Uruchomione obracanie dziennika:

logrotate truncate.cfg
Sam Hendley
źródło
To ładna teoria, ale tak naprawdę nie działa na żadnym systemie, na którym wypróbowałem. Plik tak naprawdę nie jest obcinany, a program nadal do niego dołącza, jak poprzednio. (I tak, nawet w przypadku przekierowania dokonanego za pomocą >>.) ((BTW, ta odpowiedź została już podana wcześniej.))
Miral
1
… Jak omówiono w logrotate, nie obcina oryginalnego pliku (na naszej stronie Unix i Linux). Ponadto echo /dev/urandom >> /tmp/temp.logzapisze 13 znaków deterministycznych, /tmp/temp.loga następnie natychmiast zakończy działanie. Miałeś na myśli cat /dev/urandom?
G-Man mówi „Przywróć Monikę”
2
Właśnie przetestowałem tutaj i wydaje się, że działa. Zawartość pliku jest kopiowana do nowego pliku dziennika. Oryginalny plik jest utrzymywany otwarty przez proces i jest obcinany (rozmiar pokazuje teraz 0).
Philipp
1
Uważaj na możliwą utratę danych dzięki copytruncate.
wanghq
1
+1, chociaż „Zauważ, że jest bardzo mały przedział czasu między kopiowaniem pliku a jego obcinaniem, więc niektóre dane logowania mogą zostać utracone”.
Tagar
3

Czy istnieje sposób, aby Logrotate działał z przekierowanym standardowym procesem trwającego procesu?

Tak! Sprawdź dyrektywę „copytruncate” oferowaną przez logrotate. Określenie, które każe logrotate poradzić sobie z tą właśnie sytuacją: prosty program, który utrzymuje swój plik dziennika otwarty przez czas nieokreślony.

Jedno zastrzeżenie może, ale nie musi stanowić problemu w twojej sytuacji:

Zauważ, że pomiędzy kopiowaniem pliku a obcięciem jest bardzo krótki przedział czasu, więc niektóre dane rejestrowania mogą zostać utracone.

Anegdotycznie widziałem źródła dziennika w „świecie rzeczywistym”, które zachęcają użytkowników do stosowania tej dyrektywy. Jest jakaś dyskusja o tej opcji tutaj .

natevw
źródło
3

Użyj podziału, to część coreutils. Może przyjmować standardowe wejście i dzielić je na kawałki (na podstawie wielkości fragmentu lub liczby linii itp.).

Przykład:

app | split --bytes 1G - /var/logs/put-prefix-here

Uwaga dash (-) instruuje „split”, aby używał stdin zamiast pliku.

Nazar
źródło
Czy możesz rozszerzyć swoją odpowiedź, aby opisać, jak to zrobić? Dzięki.
fixer1234
właśnie zaktualizowałem moją odpowiedź za pomocą przykładu.
Nazar
1G ma dowolny rozmiar, po czym uruchamia nowy plik?
fixer1234
1
Nie jest to szczególnie dobre rozwiązanie problemu, ponieważ oznacza, że ​​możesz skończyć z połową wiadomości w jednym pliku i połową w następnym. Istnieje również ryzyko utraty danych, jeśli komputer ulegnie awarii, gdy splitdane będą w dużym buforze. Biorąc pod uwagę, że istnieje wiele narzędzi, które prawidłowo rozwiązują ten problem, nie sądzę, aby takie rozwiązanie można było polecić.
David Richerby,
1
@David Richerby- co powiesz na dodanie -u dla niebuforowanego?
Nick
3

Podoba mi się multilogmój przypadek użycia, ale mój przypadek użycia jest tak trywialny / prosty, że nie jest on opisany bardzo prosto w znalezionych dokumentach / przykładach. Oto prosty przykład obracania wielu znaków:

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

Niektóre uwagi:

  • to zrzuca logi do tego katalogu / tmp / myapp /
  • s10000 reprezentuje 10 000 bajtów *
  • n5 reprezentuje 5 plików. * „Bieżący” dziennik liczy się jako jeden z plików, więc obejmuje 4 starsze dzienniki + „bieżący”
  • jest to oparte na adaptacji przykładów François Beausoleila pod adresem : http://blog.teksol.info/pages/daemontools/best-practices
  • Nie rozumiem wielu opcji - odsyłam do różnych dokumentów, aby rozszerzyć to ...
  • Dokumenty ostrzegają, że: "Note that running processor may block any program feeding input to multilog."gdzie „procesor” jest '!tai64nlocal'częścią polecenia

* W przypadku wielu aplikacji są to złe opcje do długotrwałego użytkowania. Pozwalają one obserwować zachowanie napełniania i obracania kłód szybciej niż duże kłody.

Wreszcie, nie zapomnij o nohup, jeśli to konieczne! Bez nohup nie potrzebujesz 2>&1(s = 10e6 in = 30 tutaj):

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

To polecenie powinno zacząć.

szałwia
źródło
1

Chciałem tylko dodać do powyższego komentarza Sama Hendleya:

Sztuczka polega na tym, że przekierowanie odbywa się za pomocą >>(append) zamiast >(create).

Natknąłem się na ten sam problem, w którym oryginalny plik wciąż rośnie, jeśli używasz >(twórz), ale jeśli używasz >>(dołącz) Logrotate copytruncate działa pięknie i zgodnie z oczekiwaniami. Oryginalny plik wraca do zera bajtów, a program kontynuuje zapis.

Przekieruj STDOUT i STDERR do obrotowego pliku dziennika:

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. Utwórz plik konfiguracyjny logrotate pod /etc/logrotate.dnazwą cokolwiek, w moim przypadku output_roll.

    Przykładowa konfiguracja dla mojego przypadku:

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
    
  3. Skonfiguruj swoje zadanie cron w /etc/crontabpliku

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    Spowoduje to sprawdzenie pliku co minutę. Możesz dostosować do swoich potrzeb.

  4. Uruchom go:

    $> service crond restart
    
  5. Otóż ​​to

Uwaga: Miałem również problem z ustawieniem SELinux, SELINUX=enforcingwięc ustawiłem go na SELINUX=disabled.

użytkownik578558
źródło
1

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

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.

Victor Sergienko
źródło