Логротат не працює


18

Я намагаюся змусити logrotate працювати над своїм VPS, щоб обертати файли apache щотижня. В даний час вміст конфігураційного файла apache2 є таким.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

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

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Будь-які ідеї щодо того, що я налаштував неправильно?

Мій файл статусу також порожній :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Оновлення

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

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf

Відповіді:


17

Я думаю, що це weeklyозначає, що logrotate хоче бачити щонайменше тиждень запис для вашого файлу access.log, щоб повернути його.

Тому проблема, здається, полягає в тому, що ви не зберігаєте запис стану, щоб викликати обертання.


Ось описаний приклад простого випадку про те, як logrotate вирішує повернути лог-файл
(це контури Fedora, Ubuntu, Centos тощо можуть бути різними)

(Я зробив декілька запитів, щоб http://localhostу access_log були деякі записи, інакше логротат ніколи не обертається ...)

Тож я встановив свій логротат для апачі щотижня;

/var/log/httpd/*log {
        weekly
...
}

і спочатку у /var/lib/logrotate.statusфайлі немає запису

# grep access_log /var/lib/logrotate.status
<- nothing

Так logrotate не обертає access_logфайл;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Однак якщо я запускаю логротат вручну, так

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

тепер у державному файлі є запис для httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Однак apache все ще не збирається обертати журнал, тому що запис лише 0 днів (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Однак якщо ви відредагуєте файл статусу з vi vi /var/lib/logrotate.statusтаким чином, щоб встановити дату більше тижня ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Тоді logrotate тепер правильно обертає файл через те, що дата в державному файлі 2012-4-11була більше тижня тому від сьогодні2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(майте на увазі, що -dпричини запущеного циклу, тому корисні лише для перевірки. Ви повинні фактично запустити команду, не -dвводячи записів статусу чи обертати файли тощо)


1
Файли журналів мають записи, які перебувають за тиждень. Здавалося б, він працює зараз, однак, я думаю, я дізнаюся тиждень відтепер ...
Малахій

2
Вибачте, я міг би бути більш чітким у відповіді, але я думаю, що для щотижневого обертання йому потрібен запис у файл /var/lib/logrotate.statusіз датою принаймні тиждень. Я оновив відповідь прикладом ...
Том Х

Дякую за таке чітке пояснення - я повністю розумію, що стосується дати дати, це просто те, що вони не обертаються, якщо я вручну не викликаю команду ... Це як би CRON не викликає поворот журналу?
Малахій

Я відносно новий в адміністрації Linux ... Всередині /etc/cron.daily/logrotate/ є: #! / Bin / sh тест -x / usr / sbin / logrotate || вихід 0
Малачі

7
log does not need rotating

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

Або у вас проблема з часом створення журналу:

ls -al --time=ctime /var/www/user/site.com/logs/

Ви можете прокоментувати notifemptyрядок для обліку 0 байтових журналів, які не обертаються. Тоді ви захочете touchновий файл журналу перед кожним тестом, щоб logrotate має щось обертати.
Банджер

6

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

Виявилося, що проблема полягала у двох копіях логротату . Коли я запускаю logrotate вручну на своєму конфігураційному файлі лише так:

logrotate -df /etc/logrotate.d/my_service_name

він не показав жодних помилок, він просто сказав:

log does not need rotating

Я досі не знаю, чому насправді. Але коли я запускаю таку повну команду logrotate:

logrotate -f /etc/logrotate.conf

Я отримав такий рядок:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Виявилося, що файл конфігурації logrotate для моєї служби містить записи для обертання журналів доступу до nginx, а також самі сервісні журнали. І це суперечить конфігурації ngnix logrotate, яка має правило для всіх записів nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Тож рішення для мого випадку досить просте: мені просто довелося видалити суперечливі правила обертання журналів nginx з мого конфігурації .

Я припускаю, що логротат почав скасовувати обробний файл щодо конфліктів правил лише з однієї з останніх версій. Я отримую цю помилку з v.3.8.7, але під v.3.7.8 з тією ж конфліктуючою конфігурацією вона виписує ту саму помилку, але обертається штрафом. Хоча я не міг знайти жодного запису про це у логроматному журналі змін.


ви, здається, маєте рацію щодо останніх версій. У мене також були повторювані записи; але при запуску логротату вручну; це працювало просто чудово. Вночі значення повернення 0; але воно не працювало правильно ...
Кріс Мейс

2

Спробуйте запустити sudo logrotate -f --verbose /etc/logrotate.d/apache2 Дивіться, що написано в консолі, і виправте все, що не так.


0

У мене була машина Debian 7, яка після оновлення системи більше не обертала журнали пошти. Усі інші журнали, окрім пошти, були правильно обернені. Я виявив, що в журналах пошти виросло кілька гігабайт. Я завжди керував обертанням журналу через Webmin. Потім, бігаючи, logrotate -d /etc/logrotate.confя побачив таке повідомлення:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Виявилося, що мої записи обертання пошти були перелічені в /etc/logrotate.d/rsyslog.dpkg-old, що було проігноровано! Перейменування файлу виправлено обертання файлу журналу :-)

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