Jawaban:
coba ini:
truncate -s 0 /var/log/*log
EDIT:
jika Anda ingin melakukan ini lebih dari sekali, Anda harus menggunakan logrotate
untuk 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.
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 logrotate
menjalankan, 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 logrotate
untuk itu.
Sebagai tindak lanjut ke @DEN jawaban
Ini akan menemukan semua file log /var/log
dan memotongnya menjadi 0 byte.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
tetapi saya tidak yakin apakah itu 100% aman, jadi saya belum memasukkannya dalam jawaban. Karena ada file seperti dovecot.log-20180930
dan dovecot.log-20180923.gz
.
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.txt
atau : > file.txt
(dan jika bash
shell, >
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.c
dan 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 .log
file, itu sudah tercakup dalam jawaban lain - gunakan *
glob atau extended glob di bash
. Ada juga find -type f -name "*.log"
, yang memiliki -exec
flag 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/log
sering 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/null
ke file yang diinginkan. Anehnya, walaupun itu /dev/null
adalah 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:
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
for logfile in /path/*.log
sebagai gantinya.
/var/log
situlah sistem menempatkan pesan yang mungkin Anda butuhkan nanti. Ubuntu telah mengalami masalah sebelumnya. Bacaman 8 logrotate;man logrotate.conf
.