Czy istnieje odpowiedni sposób na wyczyszczenie logów?

64

Zastanawiałem się, czy istnieje ogólny sposób na wyczyszczenie logów?

Jestem nowy w Ubuntu i próbuję skonfigurować Postfix. Logowane pytanie to /var/log/mail.log. Zastanawiałem się, czy istnieje właściwy sposób, aby to wyczyścić, zamiast wchodzić w to i usuwać wszystkie linie i zapisywać je. Uważam, że czasami błędy nie są zapisywane bezpośrednio po wyczyszczeniu dziennika i zapisaniu go.

Uwaga dodatkowa: Mam problem z skonfigurowaniem Postfiksa i staram się ułatwić mi czytanie dzienników, mając nadzieję, że może mi pomóc, zamiast przewijania w dół.

mastofact
źródło
2
jeśli chcesz tylko zobaczyć koniec pliku, to ogon jest twoim przyjacielem. tail /var/log/mail.log, aby wyświetlić ostatnie 5 wierszy. tail -f /var/log/mail.log, aby zobaczyć wszystkie wiersze zapisane na końcu pliku.
user9517 30.06.11

Odpowiedzi:

79

Możesz użyć:

> /var/log/mail.log

Spowoduje to obcięcie dziennika bez konieczności edytowania pliku. To także niezawodny sposób na odzyskanie przestrzeni. Czasami ludzie popełniają błąd przy użyciu rm w dzienniku, a następnie odtwarzaniu nazwy pliku, jeśli inny proces ma otwarty plik, wówczas nie odzyskasz miejsca, dopóki ten proces się nie zamknie i nie zepsujesz jego uprawnień.

Również jeśli oglądasz zawartość dziennika, możesz użyć tailpolecenia:

tail -f /var/log/mail.log

Ctrl-C zerwie ogon.

davey
źródło
2
/bin/csh(wspólne dla FreeBSD) wydzwania to za pomocą „Niepoprawnego polecenia zerowego”, tymczasem zsh(popularny zamiennik bash) czeka EOF. Zobacz serverfault.com/a/381380/67675
poige
jak mogę to zaplanować? wstawianie >składni w crontabie nie działa, ponieważ może nie rozpoznawać jej jako składni
ishandutta2007
26

Tak, jest właściwy sposób: w ogóle nie czyścisz logów. Ci obracać je. Rotacja polega na przełączeniu wyjścia dziennika do nowego pliku o tej samej nazwie, z poprzednimi N plikami dziennika przechowywanymi pod zestawem N powiązanych nazw plików.

To, jak obraca się dzienniki, zależy od tego, jak je zapisujesz. Jest to często pomijany punkt. Niektóre odpowiedzi tutaj dotykają go przynajmniej, wspominając, że niektóre programy rejestrujące przechowują otwarty deskryptor pliku dziennika, więc samo usunięcie pliku nie zwolni miejsca, a nawet przełączy dane wyjściowe na nowy plik dziennika.

Jeśli na przykład program zapisujący plik dziennika pochodzi multilogz daemontoolspaczki , nie robisz nic, aby w ogóle obracać dzienniki - bez ręcznych skryptów, bez cronzadań. Po prostu powiedz, multilogże dane wyjściowe dziennika znajdują się w katalogu, a on sam utrzyma automatycznie obrócony i ograniczony rozmiarami zestaw N plików dziennika w tym katalogu.

Jeśli program zapisujący pliki dziennika pochodzi svlogdz runitpakietu , w innym przykładzie, to samo dotyczy. W ogóle nie robisz nic oprócz wskazywania narzędzia w katalogu. Sama utrzyma automatycznie obrócony i ograniczony rozmiarami zestaw N plików dziennika w tym katalogu.

Jeśli używasz rsyslogdo zapisywania plików dziennika, program rejestrujący może zostać zatrzymany po osiągnięciu przez plik dziennika określonego rozmiaru i uruchomieniu skryptu . Musisz napisać treść skryptu, aby faktycznie zmienić nazwę pliku dziennika i usunąć stare pliki dziennika na podstawie ograniczeń dotyczących całkowitego rozmiaru, ale przynajmniej program rejestrujący zamknął plik i wstrzymał zapisywanie dziennika podczas tego procesu.

Stary syslogdsposób obracania dzienników, wciąż oczekiwany przez programy do rejestrowania, takie jak syslog-ng, i którego przykładem są narzędzia, takie jak logrotatewspomniane djangofanw innej odpowiedzi tutaj, jest nieco bardziej przypadkowy. Jeden uruchamia cronzadanie, które okresowo zmienia nazwy plików dziennika i ponownie uruchamia demona rejestrującego (używając dowolnego nadzorcy demonów, na którym działa). Problem polega na tym, że nie wymusza to ograniczenia rozmiaru ogólnego. W wolnych tygodniach można uzyskać N bardzo małych dziennych plików dziennika, podczas gdy w pracowite dni można uzyskać 1 bardzo duży plik dziennika, który znacznie przekracza limit rozmiaru.

Dlatego później i lepsze narzędzia, jak multilogi svlogdposiada opcje konfiguracyjne rozmiar plików i faktycznie sprawdzić plik dziennika wielkości siebie, oczywiście. Świat nauczył się, że odpytywanie dzienników zgodnie z harmonogramem z cronzadaniami, a nawet logrotatedemonem, pozostawia okna, aby rozmiar był niepoprawny, oraz że właściwe miejsce do przeprowadzania tych kontroli i tak rygorystycznie egzekwuje ograniczenia wielkości zdefiniowane przez administratora, aby pliki dziennika nigdy nie połykają partycji, na której się znajdują, są w programie, który faktycznie zapisuje pliki na pierwszym miejscu.

JdeBP
źródło
Jeśli chodzi o rsyslog, można go łatwo skonfigurować tak, aby polegał na nazwach plików opisanych „wzorcem” obejmującym na przykład ROK, MIESIĄC i DZIEŃ. Jest to tak proste, jak posiadanie template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")dyrektywy, po której następuje if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. W ten sposób rotacja logów jest po prostu bezproblemowa, przynajmniej gdy pojedynczy plik dziennie jest w porządku. W przypadku bardzo dużych dzienników (wymagających wielokrotnej rotacji dziennie) $HOURrównież jest to możliwe.
Damiano Verzulli
13

Możesz też tego użyć ..

truncate /opt/package/logs/*.log --size 0

Tutaj wszystkie pliki dziennika w / opt / package / logs staną się puste.

Jasar
źródło
Nie rozumiem, jak mogłoby to być lepsze niż starsze odpowiedzi.
kasperd
4
Jest to w rzeczywistości bardzo dobra odpowiedź i naprawdę jedyna, która bezpośrednio odpowiada na pytanie, czy istnieje właściwy sposób obcinania plików dziennika. JAK to jest lepsze niż inne odpowiedzi, to znaczy, że nie usuwa pliku dziennika, zeruje zawartość poprawnie, więc błędy uprawnień i brakujące pliki dziennika, które powodują panikę niektórych demonów, nie wystąpią w tym przypadku.
hmedia1
11

Tak, istnieje narzędzie dla systemu Linux o nazwie LogRotate .

djangofan
źródło
9
Drobna korekta: to nie jest usługa, to narzędzie, zwykle uruchamiane z usługi cron.
rvs
10

Jeśli powodem wyczyszczenia dziennika jest zwolnienie miejsca, możesz do nich cat / dev / null, bez przerywania pisania programów w nim. Nigdy ich nie usuwaj! niektóre oprogramowanie może narzekać, przestając działać lub całkowicie ignorując dziennik do następnego uruchomienia

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done
Elvis
źródło
3
Aby rekurencyjnie wyczyścić pliki dziennika:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai
4

Nadpisywanie krótkich i zgodnych treści: : > /dest/file

Ale istnieje także wywołanie systemowe truncate (2) i odpowiednie narzędzie przestrzeni użytkownika truncatew wielu * NIX'ach.

poige
źródło
1

Jeśli chcesz zachować plik przed jego wyczyszczeniem, możesz:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Jeśli chcesz wyszukać konkretny tekst lub wiadomość e-mail w dzienniku, możesz użyć grep. Jeśli chcesz zachować trochę grafiki na temat wykorzystania poczty, możesz użyć AWStats.

ghm1014
źródło
1

Oto jak to robię, a dotyczy to tylko NGINX, możesz to usunąć, aby działało na wszystkich plikach dziennika.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}
Ahmad Awais
źródło
-2

cat / dev / null> / path / to / logfile

Pracuje dla mnie

Carlos Gallardo I.
źródło