Logrotate не работает

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

Любые идеи относительно того, что Iv'e настроен неправильно?

Мой файл статуса тоже пуст :(

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

Обновить

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

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 было несколько записей, иначе logrotate никогда не вращается ...)

Таким образом, я установил свой logrotate для Apache еженедельно, вот так;

/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

Однако, если я запускаю logrotate вручную, вот так;

#  /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 не вызывает log log rotate?
Малахи
Я относительно новичок в администрировании Linux ... Внутри /etc/cron.daily/logrotate/ есть: #! / Bin / sh test -x / usr / sbin / logrotate || выход 0
Малахи
7
log does not need rotating

Это может быть из-за того, что ваши файлы журнала пусты.
Это может произойти из-за того, что apache все еще записывает предыдущий файл журнала, который был переименован без перезапуска apache. Таким образом, access.log стал access.log.1, и apache пишет в него.

Или у вас есть проблемы со временем создания журнала:

ls -al --time=ctime /var/www/user/site.com/logs/
Грегори МУССАТ
источник
Вы можете закомментировать notifemptyстроку, чтобы иметь дело с 0-байтовыми журналами, не вращающимися. Затем вы захотите touchсоздать новый файл журнала перед каждым тестом, чтобы logrotate мог что-то вращать.
Banjer
6

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

Выяснилось, что проблема заключалась в дублировании записей logrotate . Когда я запускаю 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 из моей конфигурации .

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

Иннокентий
источник
Вы, кажется, правы относительно самых последних версий. У меня также были повторяющиеся записи; но при запуске logrotate вручную; это работало просто отлично. Ночью возвращаем значение 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, что было проигнорировано Переименование файла исправило ротацию файла журнала :-)

lucaferrario
источник