Apakah ada cara yang tepat untuk menghapus log?

65

Saya bertanya-tanya apakah ada cara yang tepat untuk menghapus log secara umum?

Saya baru di Ubuntu dan saya mencoba mengatur Postfix. Log in yang dimaksud adalah /var/log/mail.log. Saya bertanya-tanya apakah ada cara yang benar untuk menghapusnya, daripada saya yang masuk dan menghapus semua baris dan menyimpannya. Saya menemukan bahwa kadang-kadang kesalahan tidak dapat dituliskan segera setelah saya menghapus log dan menyimpannya.

Catatan: Saya mengalami masalah dalam mengatur Postfix dan berusaha membuatnya lebih mudah bagi saya untuk membaca log dengan harapan dapat membantu saya, daripada harus gulir ke bawah.

mastofact
sumber
2
jika Anda hanya ingin melihat akhir file maka tail adalah teman Anda. tail /var/log/mail.log untuk menampilkan 5 baris terakhir. tail -f /var/log/mail.log untuk melihat semua baris yang ditulis hingga akhir file.
user9517 mendukung GoFundMonica

Jawaban:

79

Anda dapat gunakan:

> /var/log/mail.log

Itu akan memotong log tanpa Anda harus mengedit file. Ini juga cara yang dapat diandalkan untuk mendapatkan ruang kembali. Kadang-kadang orang membuat kesalahan dengan menggunakan rm pada log kemudian membuat ulang nama file, jika proses lain memiliki file terbuka maka Anda tidak mendapatkan ruang kembali sampai proses itu menutup itu menangani di atasnya dan Anda dapat mengacaukan izin itu.

Juga jika Anda menonton konten log Anda mungkin ingin menggunakan tailperintah:

tail -f /var/log/mail.log

Ctrl-C akan menghentikan tailing.

davey
sumber
2
/bin/csh(umum untuk FreeBSD) akan menjamin ini dengan "Perintah null tidak valid", sementara itu zsh(pengganti populer untuk bash) akan menunggu EOF. Lihat serverfault.com/a/381380/67675
poige
bagaimana saya bisa menjadwalkannya? menempatkan >sintaks di crontab tidak berjalan karena mungkin tidak mengenalinya sebagai sintaks
ishandutta2007
26

Ya, ada cara yang tepat: Anda tidak menghapus log sama sekali. Anda memutar mereka. Rotasi melibatkan pengalihan output log ke file baru, dengan nama yang sama, dengan file log N sebelumnya disimpan di bawah set nama file terkait N.

Bagaimana seseorang memutar log tergantung dari bagaimana seseorang menulisnya di tempat pertama. Ini adalah poin yang sering diabaikan. Beberapa jawaban di sini menyentuh setidaknya, menyebutkan bahwa beberapa program logging menyimpan deskriptor file terbuka untuk file log, jadi hanya menghapus file tidak akan membebaskan ruang, atau bahkan beralih output ke file log baru.

Jika program yang menulis file log multilogdari daemontoolspaket , misalnya, maka Anda tidak melakukan apa pun untuk memutar log sama sekali - tidak ada skrip manual, tidak ada cronpekerjaan. Katakan saja multilogbahwa log output adalah ke direktori, dan itu sendiri akan mempertahankan secara otomatis diputar dan ukuran file log N tertutup dalam direktori itu.

Jika program yang menulis file log svlogddari runitpaket , untuk contoh lain, maka banyak hal yang sama berlaku. Anda tidak melakukan apa-apa selain dari titik alat di direktori. Itu sendiri akan memelihara satu set N file log yang diputar secara otomatis dan ukuran-capped dalam direktori itu.

Jika Anda menggunakan rsysloguntuk menulis file log, maka program logging dapat diperintahkan untuk berhenti setelah file log mencapai ukuran tertentu dan menjalankan skrip . Anda harus menulis daging skrip, untuk benar-benar mengganti nama file log dan menghapus file log lama berdasarkan batasan ukuran total, tetapi setidaknya program logging telah menutup file dan berhenti menulis log saat ini sedang terjadi.

Cara lama syslogdmemutar log, masih diharapkan oleh program logging seperti syslog-ng dan dicontohkan oleh alat-alat seperti yang logrotatedisebutkan djangofandalam jawaban lain di sini, agak lebih serampangan. Seseorang menjalankan cronpekerjaan yang secara berkala mengganti nama file log, dan me-restart daemon logging (menggunakan pengawas daemon apa pun yang dijalankannya di bawah). Masalah dengan ini, tentu saja adalah bahwa hal itu tidak memberlakukan batas ukuran keseluruhan. Pada minggu-minggu yang lambat seseorang dapat memperoleh N file log harian yang sangat kecil, sedangkan pada hari-hari yang sibuk seseorang dapat memperoleh 1 file log yang sangat besar yang melebihi batas ukuran.

Inilah sebabnya mengapa nanti dan alat yang lebih baik suka multilogdan svlogdmemiliki opsi konfigurasi ukuran file dan sebenarnya memeriksa ukuran file log itu sendiri, tentu saja. Dunia telah belajar bahwa polling log pada jadwal dengan cronpekerjaan, atau bahkan logrotatedaemon, meninggalkan jendela untuk ukuran menjadi salah, dan bahwa tempat yang tepat untuk melakukan pemeriksaan ini, dan dengan keras menegakkan topi ukuran yang ditentukan administrator sehingga seseorang file log tidak pernah menelan partisi yang mereka aktifkan, ada dalam program yang sebenarnya menulis file di tempat pertama.

JdeBP
sumber
Sedangkan untuk rsyslog, dapat dengan mudah dikonfigurasikan sehingga bergantung pada nama file yang dijelaskan oleh "pola" termasuk, misalnya, YEAR, MONTH, dan DAY. Ini semudah memiliki template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")arahan, diikuti oleh a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. Dengan cara ini, rotasi log bukan masalah, setidaknya ketika satu file per hari tidak masalah. Untuk volume log yang sangat tinggi (perlu beberapa rotasi per hari), ada $HOURjuga.
Damiano Verzulli
13

Anda dapat menggunakan ini juga ..

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

Di sini semua file log di / opt / package / log akan menjadi kosong ..

Yasar
sumber
Saya tidak melihat bagaimana ini bisa lebih baik daripada jawaban yang lebih lama.
kasperd
4
Ini sebenarnya jawaban yang sangat bagus, dan benar-benar satu-satunya yang secara langsung menjawab pertanyaan apakah ada cara yang tepat untuk memotong file log. BAGAIMANA lebih baik daripada jawaban lain adalah bahwa tidak HAPUS file log, itu nol konten dengan benar, sehingga kesalahan izin dan file log hilang yang menyebabkan beberapa daemon panik tidak akan terjadi dalam kasus ini.
hmedia1
11

Ya, ada alat untuk linux yang disebut LogRotate .

Djangofan
sumber
9
Hanya koreksi kecil: ini bukan layanan, ini adalah alat, biasanya dijalankan dari layanan cron.
rvs
10

Jika alasan Anda menghapus log adalah untuk mengosongkan ruang, Anda dapat menggunakan / dev / null untuknya, tanpa mengganggu program yang menulisnya. Jangan pernah menghapusnya! beberapa perangkat lunak mungkin mengeluh dengan berhenti bekerja atau mengabaikan log sepenuhnya sampai restart berikutnya

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
sumber
3
Untuk menghapus file log secara rekursif:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai
4

Timpa konten pendek dan kompatibel: : > /dest/file

Tetapi ada juga pemanggilan sistem terpotong (2), dan alat userspace yang sesuai truncatepada banyak * NIX'es.

poige
sumber
1

Jika Anda ingin menyimpan file sebelum membersihkannya, Anda dapat melakukan:

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

Jika Anda ingin mencari teks atau email tertentu di log, Anda dapat menggunakan grep. Jika Anda ingin menyimpan beberapa gambar tentang penggunaan email, Anda dapat menggunakan AWStats.

ghm1014
sumber
1

Inilah cara saya melakukannya, dan ini hanya untuk NGINX, Anda dapat menghapusnya agar dapat berfungsi pada semua file log.

# 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
sumber
-2

cat / dev / null> / path / ke / logfile

Bekerja untukku

Carlos Gallardo I.
sumber