Yanıtlar:
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.
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 logrotate
koşuyorsanız, döndürülmüş .gz
gü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 logrotate
bunun için.
@DEN cevabına kadar takip
Bu işlem, tüm günlük dosyalarını bulur /var/log
ve 0 bayta indirir.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
yerine kullanacağım ama% 100 güvenli olduğundan emin değilim, bu yüzden cevaba dahil etmedim. Çünkü dovecot.log-20180930
ve gibi dosyalar var dovecot.log-20180923.gz
.
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.txt
veya gibi bir şeydir : > file.txt
(ve bash
kabuk 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.c
ve derleyin gcc trunc.c -o trunc
ve 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 .log
dosyaları 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/log
sı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.1
sen 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:
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
for logfile in /path/*.log
Bunun yerine kullanın .
/var/log
sistemin daha sonra ihtiyacınız olabilecek mesajları koyduğu yerdir. Ubuntu daha önce sorunla karşılaştı. Okuyunman 8 logrotate;man logrotate.conf
.