Bagaimana cara memotong semua file log?

18

adakah yang bisa memberi saya solusi untuk memotong semua logfile di /var/log/direktori?

dan pertanyaan hanya untuk pengetahuan, apakah itu ide yang bagus atau tidak?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
piring
sumber
1
BUKAN ide yang bagus - di /var/logsitulah sistem menempatkan pesan yang mungkin Anda butuhkan nanti. Ubuntu telah mengalami masalah sebelumnya. Baca man 8 logrotate;man logrotate.conf.
waltinator

Jawaban:

34

coba ini:

truncate -s 0 /var/log/*log

EDIT:

jika Anda ingin melakukan ini lebih dari sekali, Anda harus menggunakan logrotateuntuk menangani log Anda. Biasanya itu dipasang di ubuntu. Lihat man logrotate(atau jika Anda belum menginstalnya lihat di manual online atau instal dengan sudo apt-get install logrotate)

dari halaman manual:

logrotate dirancang untuk memudahkan administrasi sistem yang menghasilkan banyak file log. Ini memungkinkan rotasi otomatis, kompresi, penghapusan, dan pengiriman file log. Setiap file log dapat ditangani setiap hari, mingguan, bulanan, atau ketika tumbuh terlalu besar.

SARANG
sumber
Anda juga dapat mengosongkannya dengan menggunakan echo ""> * log
Astm
10

Jika Anda ingin menghapus semua file log Anda, bukan hanya yang ada di folder log tingkat pertama, Anda bisa menggunakan:

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

Memperhatikan bahwa jika Anda sudah logrotatemenjalankan, Anda harus menghapus yang diputar.gz log yang :

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

Penggunaan yang valid untuk ini bisa berupa membangun wadah alat VM untuk distribusi, misalnya.

Anda tidak perlu melakukan ini sebagai bagian dari pemeliharaan rutin: seperti yang disarankan DEM dengan benar, gunakan logrotateuntuk itu.

msanford
sumber
1

Sebagai tindak lanjut ke @DEN jawaban

Ini akan menemukan semua file log /var/logdan memotongnya menjadi 0 byte.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Luka
sumber
1
Saya akan menggunakan *.log*tetapi saya tidak yakin apakah itu 100% aman, jadi saya belum memasukkannya dalam jawaban. Karena ada file seperti dovecot.log-20180930dan dovecot.log-20180923.gz.
Luka
0

Ada beberapa metode untuk memotong file sepenuhnya, umumnya berlaku untuk sebagian besar OS yang kompatibel dengan POSIX. Paling umum yang akan Anda lihat dengan skrip shell adalah sesuatu seperti true > file.txtatau : > file.txt(dan jika bashshell, >pengalihan saja sudah cukup). Itu karena cara >membuka file melalui open()atau openat()syscall denganO_WRONLY|O_CREAT|O_TRUNC bendera - yang bertuliskan hanya-menulis ATAU buat jika nama file tidak ada, ATAU potong nama file yang ada.

Dengan mengingat hal itu, kita dapat mengimplementasikan sesuatu seperti itu di C sendiri:

#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;
}

Beri nama file yang menyimpan kode ini sebagai trunc.cdan kompilasi dengan gcc trunc.c -o trunc, dan Anda memiliki utilitas kecil yang akan memotong argumen nama file yang disediakan seperti pada trunc ./foobar.txt. Tentu saja, kode ini tidak melakukan pemeriksaan lain, hanya memotong parameter posisi pertama. Saya akan menyerahkan kepada pembaca untuk mencari tahu bagaimana menangani lebih dari satu parameter posisi. Di samping catatan, ada truncate()syscall yang bisa kita gunakan juga, dan memotong file ke panjang variabel.

Sekarang, jika Anda bukan penggemar C, Python mungkin lebih mudah bagi Anda. open()perintah beroperasi pada prinsip yang sama dengan Python - membuka file untuk menulis dan memotong jika nama file ada. Demikian yang bisa kita lakukan

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

Sedangkan untuk menemukan semua .logfile, itu sudah tercakup dalam jawaban lain - gunakan *glob atau extended glob di bash. Ada juga find -type f -name "*.log", yang memiliki -execflag untuk menjalankan perintah (dalam kasus khusus ini sh -c ''untuk mengambil keuntungan >karena >merupakan operator shell dan bukan executable eksternal). Dengan begitu bisa Anda lakukan

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

Ini juga diperhatikan bahwa file log dalam direktori seperti /var/logsering diputar oleh layanan logrotate, sehingga akan ada nama file seperti /var/log/service.log, /var/log/service.log.1, dll, sehingga Anda mungkin ingin menggunakan *.log.[1-9]pola sebagai gantinya


Antara lain, kita bisa menyalin /dev/nullke file yang diinginkan. Anehnya, walaupun itu /dev/nulladalah jenis file perangkat karakter khusus, ketika Anda menyalinnya di tempat lain hasilnya adalah file biasa yang kosong, setidaknya dengan GNU cp. Demikian yang bisa kita lakukan

cp /dev/null foo.txt

atau

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

Bacaan lain yang disarankan:

Sergiy Kolodyazhnyy
sumber
0

Ini adalah praktik yang baik untuk memutar log di / var / log untuk memutar dengan fungsi logrotate tetapi tidak setiap kali kita ingin melakukannya. Log sistem akan dicetak padanya dan akan berguna untuk men-debug setiap kegagalan.

Jika itu adalah persyaratan untuk tidak menggunakan logrotate, maka opsi dapat dieksplorasi. Meskipun truncate adalah pilihan mudah dalam beberapa rasa sistem unix, perintah ini tidak tersedia, perlu diinstal. Jika tidak diizinkan untuk menginstal perintah baru maka loop di bawah ini dapat digunakan.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
Devoloper250
sumber
Bash Pitfall # 1 : Jangan menulis untuk loop seperti itu. Gunakan for logfile in /path/*.logsebagai gantinya.
PerlDuck