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


9

Чому Apache відмовляється записувати файли журналу ( ErrorLog/ / CustomLog) після того, як я вручну видалив їх вміст?

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

Чому це так? Як я можу безпечно очистити файл журналу, не перезавантажуючи Apache?

У мене Apache 2.2.14 на Ubuntu 10.04.


Як видалити вміст?
Дом

@Dom Я просто відкриваю його з vim, роблю "dG" (який видаляє весь вміст), а потім зберігаю з "! Wq". Право власності / групи / дозволів не змінюється.
AtomicFault

3
@AtomicFault Prrrobably тому, що це не так, як ви повинні обертати журнали Apache . Ви повинні використовувати щось на зразок, logrotateяке надсилає Apache відповідний сигнал для перезавантаження / перезавантаження (див. Відповідь Педро нижче). Nickgrim висвітлював питання "чому" за вашими журналами зупиняється - Apache все ще пише до старого inode (який більше не підключений до файлової системи, де б ви не могли потрапити на нього)
voretaq7

Відповіді:


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(який, здається, усікає на місці)


2
echo>

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.