Logrotate Успішний оригінальний файл повертається до початкового розміру


11

Хтось мав якісь проблеми з логротатом, перш ніж це спричиняє поворот файлу журналу, а потім повертається до того ж розміру, який він був раніше? Ось мої висновки:

Сценарій логротету:

/var/log/mylogfile.log {
    обертати 7
    щодня
    компрес
    olddir / log_archives
    пропуск
    notifempty
    копіювати
}

Докладний вихід логротату:

копіювання /var/log/mylogfile.log в /log_archives/mylogfile.log.1
обрізання /var/log/mylogfile.log
стиснення журналу за допомогою: / bin / gzip
видалення старого журналу /log_archives/mylogfile.log.8.gz

Файл журналу після усікання трапляється

[root @ server ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 частина1 частина1 0 11 січня 17:32 /var/log/mylogfile.log

Буквально секунди пізніше:

[root @ server ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 частина1 частина1 3.5G 11 січня 17:32 /var/log/mylogfile.log

Версія RHEL:

[root @ server ~] # cat / etc / redhat-release 
Реліз Red Hat Enterprise Linux ES 4 (оновлення Nahant 4)

Версія Logrotate:

[root @ DAA21529WWW370 ~] # rpm -qa | греп логротат
логротат-3.7.1-10.RHEL4

Кілька приміток:

  • Служба не може бути перезапущена під час польоту, тому я використовую copytruncate
  • Журнали обертаються щовечора, відповідно до olddirкаталогу, який має файли журналів щоночі.

Відповіді:


18

Це, мабуть, тому, що навіть якщо ви врізаєте файл, процес запису у файл продовжуватиметься писати в той момент, коли це було зрушено, нарешті. Тож, що відбувається, це те, що logrotate обрізає файл, розмір якого дорівнює нулю, процес записує у файл знову, продовжуючи зсув, який він припинив, і тепер у вас є файл з NULL-байтами до того моменту, коли ви усікали його плюс новий записи, записані до журналу.

od -c після урізання + раптовий ріст, генерований випуск за лініями:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

Це говорить від зміщення 0 до 33255657600, ваш файл складається з нульових байтів, а потім деяких розбірливих даних. Щоб дістатися до цього стану, не потрібно стільки ж часу, як би насправді записати всі ці нульові байти. Файлові системи ext {2,3,4} підтримують щось, що називається розрідженими файлами, тому якщо ви шукаєте повз область файлу, яка нічого не містить, вважається, що ця область містить нульові байти і не займає місця на диску. Ці нульові байти насправді не будуть записуватися, а просто вважається, що вони є, тому час, який потрібно для переходу до 0–3 ГБ, не потребує багато часу. (Ви можете протестувати кількість часу, який потрібно, зробивши щось подібне dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1, це повинно генерувати файл розміром понад 3 Гб за кілька мілісекунд).

Якщо ви запускаєте ls -lsсвої логіни після того, як вони були усічені і знову виникли раптові темпи зростання, тепер слід повідомити про число на початку рядка, який представляє фактичний розмір (у блоках, зайнятих на диску), що, ймовірно, становить порядки менший, ніж розмір, про який повідомив просто ls -l.


Я не думаю, що так - за лічені секунди файл журналу переходить від 0 байт до 3,5 ГБ. Загальний час, необхідний для завершення логротату, становить приблизно 5 мінусів. Файли журналу не записуються так швидко І розмір - це завжди початковий розмір, який здається занадто збігом випадкових.
підкреслив

Повинен бути простий спосіб перевірити це, оглянути файл і побачити, чи є в ньому насправді щось. Почніть із запуску назви файлу od -c | head -n 100. Швидше за все, він скаже вам в декількох рядках, що навантажений нульовими байтами, а також останні записи в журналі.
Kjetil Joergensen

Якщо це так, то чи можемо ми перевірити, чи cat / dev / null> /var/log/mylogfile.log обрізає файл способом, який вирішує цю проблему, а не використовуючи вбудований у copytruncate логротат?
mtinberg

2
Проблема полягає не в тому, як усічений файл, проблема полягає в тому, як програма записує файл журналу. Щоб обрізання лог-файлу було життєздатним підходом, вам доведеться змусити програму запису до лог-файлу якось прагнути до позиції 0. Можливо, що файлова система, яка не підтримує розріджені файли, не мала б цієї проблеми, хоча я не вважаю Я не маю жодного способу перевірити це зараз.
Kjetil Joergensen

1
Ця остаточна відповідь насправді мала більше сенсу, і виправлення, ймовірно, закінчиться перезавантаженням програми.
невдалийхарактер

2

Я надзвичайно впевнений, що К'єтіл це вдарив. Дрю, ти можеш ще не переконатись у його поясненні, але я закликаю уважно прочитати те, що він сказав.

Якщо ви приймаєте це, виправлення або зупинити і перезапустити додаток, коли журнали обертаються, або використовувати такий інструмент, як "rotatelogs" апаша, де ви подаєте журнал на інструмент через трубу, і інструмент дбає про обертання лог-файлу кожен так часто. Наприклад, один із моїх апаратних примірників apache входить до журналу

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

що спричиняє безліч журналів з такими іменами

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

з'являтися без перезавантаження апаша; Потім я можу стискати їх вручну після факту. Зверніть увагу на те, як ротація проводиться щотижня, що становить кожні 604800 секунд, на що передається аргумент rotatelogs.

Якщо ви не можете зупинити та перезапустити додаток, і він не може увійти через канал, я думаю, у вас справжня проблема. Можливо, інші будуть мати пропозиції.


0

було б дійсно чудово, якби ви могли відправити цілий логротат.

Навіщо намагатися використовувати kill -HUP? Метод (класичне перезавантаження не перезапуск ).

Також ... перевірте, lsof хто має доступ до файлу.


Не можна використовувати, kill -HUPоскільки цей додаток не можна торкатися жодним чином - це чутливий додаток, яким я не володію (я навіть не керую ним - я керую лише стороною ОС), тому мені потрібно мати змогу робити логратації цього шлях.
підкреслено,

1
Вибачте, оригінальне повідомлення надійшло рано, ось решта мого оригінального повідомлення: Я ввійшов у систему сьогодні вранці, і файл повернувся до нормального стану після того, як /etc/cron.dailyбуло розпочато запланований логротат . Питання до всіх: Чи є щось, що сценарій logrotate робить інакше, ніж запуск logrotate вручну? Мій сценарій логротату буквально виглядає так /usr/sbin/logrotate /etc/logrotate.conf. Це зовсім неприємно.
підкреслено,

-1

Просто використовуйте ">>", що означає додавати замість ">", що означає створити зі своїх сценаріїв, які записують у цей файл. У мене була та сама проблема, і я виправив її за допомогою додати в своєму сценарії.

SomeScript.sh >> output.txt

Сподіваюся, що зрозуміліше.


Немає вказівки на те, що запис у файл журналу виконується за >допомогою сценарію. Більше того, ця відповідь є заплутаною, оскільки існує велика різниця між сценаріями >та >( )в них. Нарешті, якщо код, який виконує написання, буде оновлено, було б набагато краще, щоб він просто почав писати в новий файл реєстрації після того, logrotateяк зробив це.
kasperd

Я редагую свою відповідь, щоб вона була зрозумілішою.
користувач578558
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.