Tüm günlük dosyaları nasıl kesilir?


18

Herkes bana /var/log/dizindeki tüm günlük dosyasını kısaltmak için bir çözüm verebilir ?

ve sadece bilgi için bir soru, bu iyi bir fikir mi değil mi?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
İyi bir fikir DEĞİLDİR - /var/logsistemin daha sonra ihtiyacınız olabilecek mesajları koyduğu yerdir. Ubuntu daha önce sorunla karşılaştı. Okuyun man 8 logrotate;man logrotate.conf.
waltinator

Yanıtlar:


34

bunu dene:

truncate -s 0 /var/log/*log

DÜZENLE:

bunu bir kereden fazla yapmak istiyorsanız logrotate, günlüklerinizi işlemek için kullanmalısınız . Genellikle ubuntu'da kurulur. Bir göz atın man logrotate( veya yüklemediyseniz çevrimiçi kılavuz sayfasına bakın veya kurun sudo apt-get install logrotate)

manpage'den:

logrotate, çok sayıda günlük dosyası üreten sistemlerin yönetimini kolaylaştırmak için tasarlanmıştır. Günlük dosyalarının otomatik döndürülmesine, sıkıştırılmasına, kaldırılmasına ve postalanmasına izin verir. Her günlük dosyası günlük, haftalık, aylık veya çok büyük olduğunda işlenebilir.


ayrıca echo ""> * log kullanarak onları boşaltabilirsiniz
Astm

10

Yalnızca ilk düzey günlük klasöründeki dosyaları değil, tüm günlük dosyalarınızı temizlemek istiyorsanız, aşağıdakileri kullanabilirsiniz:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

Zaten logrotatekoşuyorsanız, döndürülmüş .gzgünlükleri de temizlemeniz gerektiğini not edin :

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

Bunun için geçerli bir kullanım, örneğin dağıtım için bir VM cihaz konteyneri oluşturmak olabilir.

Sen gerektiğini değil , rutin bakımın bir parçası olarak yapmanız gerekir: DEM oldukça düzgün, kullanımı önerildiği gibi logrotatebunun için.


1

@DEN cevabına kadar takip

Bu işlem, tüm günlük dosyalarını bulur /var/logve 0 bayta indirir.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
Bunun *.log*yerine kullanacağım ama% 100 güvenli olduğundan emin değilim, bu yüzden cevaba dahil etmedim. Çünkü dovecot.log-20180930ve gibi dosyalar var dovecot.log-20180923.gz.
Luka

0

Genellikle POSIX uyumlu işletim sistemlerinin çoğu için geçerli olan bir dosyayı tamamen kısaltmanın birkaç yöntemi vardır. Kabuk betiklemesinde göreceğiniz en yaygın şey, true > file.txtveya gibi bir şeydir : > file.txt(ve bashkabuk durumunda, >tek başına yeniden yönlendirme yeterlidir). Bunun nedeni, >dosyaları bayraklar üzerinden open()veya openat()syscall ile nasıl açtığından kaynaklanır O_WRONLY|O_CREAT|O_TRUNC- salt okunur VEYA dosya adı yoksa oluştur veya VEYA mevcut dosya adını kısaltır.

Bunu göz önünde bulundurarak, C'de kendimize böyle bir şey uygulayabiliriz:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

Bu kodu saklayan dosyayı adlandırın trunc.cve derleyin gcc trunc.c -o truncve kendinize olduğu gibi bir dosya adı argümanını kesecek küçük bir yardımcı programa sahipsiniz trunc ./foobar.txt. Tabii ki, bu kod başka kontroller yapmaz, sadece ilk konum parametresini keser. Birden fazla konum parametresiyle nasıl başa çıkılacağını anlamaya okuyuculara bırakacağım. Yan notta, truncate()kullanabileceğimiz syscall var ve bir dosyayı değişken uzunlukta kısaltıyoruz.

Şimdi, C hayranı değilseniz, Python sizin için daha kolay olabilir. open()komutu Python'da aynı prensipte çalışır - dosya adı varsa yazma ve kısaltma için açılış dosyası. Böylece yapabiliriz

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

Tüm .logdosyaları bulmaya gelince , bu zaten diğer cevaplarda kapsanmıştır - *glob veya genişletilmiş glob kullanın bash. Orada da find -type f -name "*.log"sahip olan -exec(bu özel durumda komutları çalıştırmak için bayrak sh -c ''yararlanmak >çünkü >bir kabuk operatör değil harici çalıştırılabilir olduğunu). Böylece yapabilirsin

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

Gibi O da dizinde o günlük dosyalarını fazlalaştı /var/logsıklıkla logrotate hizmeti tarafından döndürülür, böylece dosya adları böyle olacak /var/log/service.log, /var/log/service.log.1sen kullanımı isteyebilirsiniz, vb *.log.[1-9]yerine desen


Diğer şeylerin yanı sıra /dev/null, istenen dosyaya kopyalayabiliriz . Garip bir şekilde, /dev/nullözel bir karakter aygıtı türü olsa da , başka bir yere kopyaladığınızda sonuç normal bir dosyadır, en azından GNU ile cp. Böylece yapabiliriz

cp /dev/null foo.txt

veya

dd if=/dev/null of=foo.txt

Önerilen diğer kaynaklar:


0

Logrotate işleviyle döndürmek için / var / logs içindeki günlükleri döndürmek iyi bir uygulamadır, ancak yapmak istediğimiz zaman değil. Sistem günlükleri ona yazdırılacak ve herhangi bir hatayı ayıklamak için kullanışlı olacaktır.

Logrotate kullanmama şartı varsa, seçenekler araştırılabilir. Unix sisteminin birkaç çeşidinde kesme kolay bir seçenek olsa da, bu komut kolayca mevcut değildir, yüklenmesi gerekir.Yeni komutun yüklenmesine izin verilmezse, aşağıdaki döngü kullanılabilir.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

Bash Pitfall # 1 : Döngüler için bu şekilde yazma. for logfile in /path/*.logBunun yerine kullanın .
PerlDuck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.