Apache menolak untuk menulis ke file log setelah saya menghapus semua isinya secara manual

9

Mengapa Apache menolak untuk menulis file log ( ErrorLog/ CustomLogyang) setelah saya secara manual menghapus isinya?

Itu tidak akan menulis ke file log itu lagi sampai setelah saya me-restart Apache.

Mengapa demikian? Bagaimana saya bisa membersihkan file log dengan aman tanpa harus me-restart Apache?

Saya memiliki Apache 2.2.14 di Ubuntu 10.04.

Kesalahan Atomic
sumber
Bagaimana Anda menghapus konten?
Dom
@ Tom Saya baru saja membukanya dengan vim, lakukan "dG" (yang menghapus semua konten), dan kemudian simpan dengan "! Wq". Kepemilikan / grup / izin tidak diubah.
AtomicFault
3
@AtomicFault Prrrobably karena bukan itu yang seharusnya Anda memutar log Apache . Anda harus menggunakan sesuatu seperti logrotateyang mengirim sinyal reload / restart ke Apache (Lihat jawaban Pedro di bawah). Nickgrim membahas "mengapa" di balik log Anda berhenti - Apache masih menulis ke inode lama (yang tidak lagi terhubung ke sistem file di mana pun Anda bisa mendapatkannya)
voretaq7

Jawaban:

14

Saya baru saja melakukan tes singkat:

$ echo vim test > vimtest
$ ls -i vimtest
35149 vimtest
$ vim vimtest
<dG, :wq>
$ ls -i vimtest
35148 vimtest

Catatan yang vimtestmemiliki nomor inode yang berbeda setelah diedit, dan dengan demikian sebenarnya file yang berbeda (meskipun dengan nama yang sama dengan file lama).

Jadi, ketika Anda mengedit file dengan vim itu menghapus file lama, dan membuat yang baru dengan nama yang sama. Masalah yang Anda lihat disebabkan oleh Apache masih menulis ke file lama (dihapus) (Anda dapat memeriksanya dengan lsof).

Jika Anda benar-benar ingin memotong file log, pertimbangkan truncate -s 0 /path/to/file.log(yang tampaknya memotong di tempat)

pendatang
sumber
2
echo> /path/to/file.log juga berfungsi
8

Saya akan merekomendasikan memaksa rotasi file log Apache2 dengan:

$ sudo logrotate -f /etc/logrotate.d/apache2

Jika Anda melihat ke dalam /etc/logrotate.d/apache2, Anda akan melihat bahwa Apache2konfigurasi harus dimuat ulang setelah menghapus file log-nya dengan:

$ sudo /etc/init.d/apache2 reload

Di Ubuntu Anda dapat melakukan alternatif:

$ sudo service apache2 reload
Pedro Romano
sumber