czy ktoś może mi dać rozwiązanie, aby obciąć cały plik dziennika w /var/log/
katalogu?
i pytanie tylko o wiedzę, czy to dobry pomysł, czy nie?
#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
truncate -s 0 $logfile
done
command-line
scripts
files
log
pylover
źródło
źródło
/var/log
tym miejscu system umieszcza wiadomości, których możesz potrzebować później. Ubuntu już wcześniej napotkał problem. Czytaćman 8 logrotate;man logrotate.conf
.Odpowiedzi:
Spróbuj tego:
truncate -s 0 /var/log/*log
EDYTOWAĆ:
jeśli chcesz to zrobić więcej niż jeden raz, powinieneś użyć
logrotate
do obsługi dzienników. Zwykle jest instalowany w Ubuntu. Spójrz naman logrotate
(lub jeśli nie masz go zainstalowanego, spójrz na stronę online lub zainstaluj gosudo apt-get install logrotate
)ze strony man:
źródło
Jeśli chcesz wyczyścić wszystkie pliki dziennika, nie tylko te z folderu dziennika pierwszego poziomu, możesz użyć:
Zauważ, że jeśli już masz
logrotate
uruchomiony, musisz również wyczyścić obrócone.gz
dzienniki:Prawidłowym zastosowaniem tego może być na przykład zbudowanie kontenera urządzenia VM do dystrybucji.
Należy nie trzeba zrobić to jako część rutynowej konserwacji: DEM jak słusznie zaproponował wykorzystanie
logrotate
do tego.źródło
W odpowiedzi na odpowiedź @DEN
Spowoduje to znalezienie wszystkich plików dziennika
/var/log
i obcięcie ich do 0 bajtów.źródło
*.log*
zamiast tego, ale nie jestem pewien, czy jest w 100% bezpieczny, więc nie uwzględniłem tego w odpowiedzi. Ponieważ istnieją pliki takie jakdovecot.log-20180930
idovecot.log-20180923.gz
.Istnieje kilka metod pełnego obcięcia pliku, ogólnie stosowanych w większości systemów operacyjnych zgodnych z POSIX. Najczęściej spotykane w skryptach powłoki jest coś w rodzaju
true > file.txt
lub: > file.txt
(w przypadkubash
powłoki>
wystarczające jest samo przekierowanie). Wynika to ze sposobu, w jaki>
otwiera się pliki przezopen()
lubopenat()
syscall zO_WRONLY|O_CREAT|O_TRUNC
flagami - czyta tylko do zapisu LUB tworzy, jeśli nazwa pliku nie istnieje, LUB obcina istniejącą nazwę pliku.Mając to na uwadze, sami możemy zaimplementować coś takiego:
Nazwij plik, który przechowuje ten kod jako,
trunc.c
i skompiluj gogcc trunc.c -o trunc
, a będziesz mieć małe narzędzie, które obetnie argument nazwy pliku podany tak jak wtrunc ./foobar.txt
. Oczywiście ten kod nie wykonuje innych kontroli, tylko obcina pierwszy parametr pozycyjny. Pozostawiam czytelnikom ustalenie, jak radzić sobie z więcej niż jednym parametrem pozycyjnym. Na marginesie, istnieje takżetruncate()
syscall, którego moglibyśmy użyć i skrócić plik do zmiennej długości.Teraz, jeśli nie jesteś fanem C, Python może być dla Ciebie łatwiejszy.
open()
polecenie działa na tej samej zasadzie w Pythonie - otwieranie pliku do zapisu i obcinanie, jeśli nazwa pliku istnieje. W ten sposób możemy zrobićJeśli chodzi o znajdowanie wszystkich
.log
plików, zostało to już omówione w innych odpowiedziach - użyj*
glob lub rozszerzonego glob wbash
. Jest teżfind -type f -name "*.log"
, który ma-exec
flagę do uruchamiania poleceń (w tym konkretnym przypadku,sh -c ''
aby skorzystać,>
ponieważ>
jest operatorem powłoki, a nie zewnętrznym plikiem wykonywalnym). W ten sposób możesz zrobićWarto również zauważyć, że pliki dziennika w katalogu, takie jak
/var/log
często są obracane przez logrotate usługi, więc nie będzie takie jak nazwy plików/var/log/service.log
,/var/log/service.log.1
itp, więc może chcesz użyć*.log.[1-9]
wzoru zamiastMiędzy innymi możemy skopiować
/dev/null
do żądanego pliku. Co dziwne, mimo że/dev/null
jest to plik typu specjalnego urządzenia, gdy kopiujesz go w innym miejscu, wynikiem jest pusty zwykły plik, przynajmniej w GNUcp
. W ten sposób możemy zrobićlub
Inne sugerowane lektury:
źródło
Dobrą praktyką jest obracanie dzienników w / var / logs w celu obracania za pomocą funkcji logrotate, ale nie zawsze, gdy chcemy. Dzienniki systemowe zostaną wydrukowane i będą przydatne do debugowania ewentualnych awarii.
Jeśli wymagane jest nie używanie logrotate, można zbadać opcje. Chociaż obcinanie jest łatwą opcją w kilku odmianach systemu uniksowego, to polecenie nie jest łatwo dostępne, należy je zainstalować. Jeśli nie można zainstalować nowego polecenia, można użyć poniższej pętli.
źródło
for logfile in /path/*.log
zamiast tego.