Apache отказывается писать в файл журнала после того, как я вручную удаляю все его содержимое

9

Почему Apache отказывается писать в файлы журналов ( ErrorLog/ / CustomLog) после того, как я вручную удалил их содержимое?

Он не будет записывать в эти файлы журнала снова, пока я не перезапущу Apache.

Почему это так? Как я могу безопасно очистить файл журнала без перезагрузки Apache?

У меня есть Apache 2.2.14 на Ubuntu 10.04.

AtomicFault
источник
Как вы удаляете содержимое?
Дом
@Dom Я просто открываю его с помощью vim, делаю "dG" (который удаляет все содержимое), а затем сохраняю с "! Wq". Владение / группа / права не изменены.
AtomicFault 22.10.12
3
@ AtomicFault Возможно, потому что это не то, как вы должны вращать журналы Apache . Вы должны использовать что-то вроде того, logrotateчто посылает соответствующий сигнал перезагрузки / перезапуска в Apache (см. Ответ Педро ниже). Никгрим объяснил причину остановки журналов - Apache все еще пишет в старый inode (который больше не подключен к файловой системе, где бы вы ни
находились

Ответы:

14

Я только что сделал краткий тест:

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

Обратите внимание, что vimtestпосле редактирования он имеет другой номер inode и, таким образом, фактически является другим файлом (хотя и с тем же именем, что и старый файл).

Поэтому, когда вы редактируете файл с помощью vim, он удаляет старый файл и создает новый с тем же именем. Проблема, которую вы видите, вызвана тем, что Apache все еще пишет в старый (удаленный) файл (вы можете проверить это с помощью lsof).

Если вы действительно хотите обрезать файл журнала, подумайте truncate -s 0 /path/to/file.log(который, кажется, усекает на месте)

nickgrim
источник
2
echo> /path/to/file.log также работает
8

Я бы порекомендовал принудительно повернуть файлы журнала Apache2 с помощью:

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

Если вы посмотрите /etc/logrotate.d/apache2, вы увидите, что Apache2конфигурация должна быть перезагружена после удаления файла журнала:

$ sudo /etc/init.d/apache2 reload

В Ubuntu вы можете сделать следующее:

$ sudo service apache2 reload
Педро Романо
источник