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 logrotate
programie, 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?
logrotate
jeśli istnieje lepsza opcja, która brzmiała jak dogodny punkt wyjścia do dyskusji.Odpowiedzi:
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:
multilog
z Daemontoolsmultilog
z daemontools-encores6-log
z s6svlogd
z runitutinylog
od sprawcycyclog
z noshNarzędzia do przetwarzania
multilog
zestawów plików dziennika formatu obejmują między innymi:multilog-watch
logrange
multilog-stamptail
follow-log-directories
z noshexport-to-rsyslog
z noshDalsza lektura
logrotate
aninewsyslog
w tym wieku. . Często udzielane odpowiedzi.źródło
multilog
wygląda na to, czego potrzebowałem.multilog
nigdzie nie powstają ani nie wymagają dowiązań symbolicznych. Jest całkowicie neutralny w stosunku do nich.rotatelogs
narzędzie dostarczane z Apache (wbin
katalogu) (patrz docs ) wykonuje wejściowe ze standardowego wejścia i obraca dziennik po pewnej ilości konkretnego czasuźródło
Jeśli możesz mieć, aby przejść do jednego ze standardowych strumieni dziennika (syslog, demon, cron, użytkownik, zabezpieczenia, poczta itp.), Możesz
logger
zamiast tego użyć polecenia i potoku do niego.W przeciwnym razie lepiej jest przesłać zarejestrowaną zawartość do niestandardowego programu lub skryptu, aby ją obsłużyć, lub zajrzyj do
logrotate
konfiguracji.EDYCJA: Wydaje się, że odpowiedź JdeBP zawiera to, czego możesz szukać.
źródło
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):
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:
Uruchomione obracanie dziennika:
źródło
echo /dev/urandom >> /tmp/temp.log
zapisze 13 znaków deterministycznych,/tmp/temp.log
a następnie natychmiast zakończy działanie. Miałeś na myślicat /dev/urandom
?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:
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 .
źródło
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:
Uwaga dash (-) instruuje „split”, aby używał stdin zamiast pliku.
źródło
split
dane 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ć.Podoba mi się
multilog
mó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:Niektóre uwagi:
"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):To polecenie powinno zacząć.
źródło
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:
some-program.sh >> /tmp/output.txt 2>&1 &
Utwórz plik konfiguracyjny logrotate pod
/etc/logrotate.d
nazwą cokolwiek, w moim przypadku output_roll.Przykładowa konfiguracja dla mojego przypadku:
Skonfiguruj swoje zadanie cron w
/etc/crontab
plikuSpowoduje to sprawdzenie pliku co minutę. Możesz dostosować do swoich potrzeb.
Uruchom go:
Otóż to
Uwaga: Miałem również problem z ustawieniem SELinux,
SELINUX=enforcing
więc ustawiłem go naSELINUX=disabled
.źródło
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:
Jednak jest jeszcze wiele do zrobienia i przetestowania.
źródło