Як уникнути перезавантаження апаша при обертанні журналів?


25

Я використовую logrotate для обертання журналів доступу, помилок та переписування Apache. Мій файл конфігурації виглядає так:

/apache/*log {
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
    lastaction
     /bin/apache reload
    endscript
}

Моя проблема полягає в тому, що щоразу, коли відбувається обертання, Apache потрібно перезавантажувати, оскільки Apache більше не записує у щойно повернутий файл реєстрації. Чи є спосіб уникнути перезавантаження Apache кожного разу, коли логротат робить обертання?

Відповіді:


42

Причина того, що apache потребує перезавантаження, полягає в тому, що після відкриття файлу він отримує до нього файл файлів, і він продовжує писати до цього файлового файлу. Коли ви переміщуєте файл, він не бачить цього, він просто продовжує записувати на ту саму ручку. Коли ви зробите перезавантаження, він знову відкриє файл і отримає нову ручку.

Щоб уникнути перезавантаження, замість того, щоб переміщувати файл, ви можете скопіювати його та очистити старий файл. Таким чином apache може продовжувати писати в один і той же файловий файл. Ви робите це, додаючи опцію "copytruncate" у файл конфігурації logrotate, як це:

/apache/*log {
    copytruncate
    compress
    dateext
    rotate 365
    size=+300M
    olddir /log/old/apache
    notifempty
    missingok
}

Дякую за вашу відповідь. Тож я здогадуюсь, коли я додаю, lastaction echo "" | /apache/*log endscriptщо файловий накопичувач не "втрачений"?
арфа

3
Вибачте, я повинен був сказати "copytruncate" замість "copy". Тоді вам зовсім не потрібна річ з ластакцією. Я звинувачую, що в моєму потоці кофеїну занадто багато крові :-)
Jenny D

Працює як шарм :)
арфа

4
@harp, будьте обережні, доктор logrotateкаже: "Зауважте, що між копіюванням файлу та обрізанням його є дуже невеликий проміжок часу, тому деякі дані журналу можуть бути втрачені".
Тотор

Окрім можливості втрати деяких даних, чи існують інші відомі мінуси використання copytruncate?
Лев Галлегільос

5

Я рекомендую вам скористатися http://cronolog.org/

Ось як я його використовую:

CustomLog     "|/usr/local/sbin/cronolog -S /var/log/httpd/t3.CCC.eu-access_log -P /var/log/httpd/t3.CCC.eu-access_log.prev /var/log/httpd/t3.CCC.eu-%Y.log" combined

1
Підключення до будь-якої зовнішньої програми може бути проблемою, якщо на веб-сервері багато трафіку. Але це акуратно уникає проблеми файлових файлів.
Дженні Д

Виглядає як гарна альтернатива. Чи кронол стискається на ходу?
арфа

У пакеті apache2-utils є аналогічний додаток "rotatelogs". Будьте обережні, щоб не потрапити в один і той же журнальний файл з різних віртуальних серверів apache - вони будуть тупотіти один про одного.
Arie Skliarouk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.