Если веб-сервер используется активно, то разные логи быстро растут. И если совсем пустить это на самотёк, то однажды они займут всё свободное место на диске. Чтобы контролировать ситуацию существует программа Logrotate, которая автоматически архивирует логи, удаляет старые логи. Такой процесс называется ротацией логов. Программа сразу есть в Debian, но её нужно настроить.


Существует соответствующая папка /etc/logrotate.d/, куда разные программы добавляют свои настройки для Logrotate.

Далее пример файла настроек, который я обычно создаю на веб-сервере. Он один для всех сайтов сразу. Предназначен для настроек обработки логов, генерируемых Nginx. Но ничего не мешает добавить в перечень и другие каталоги для обработки. Из комментариев сразу всё ясно:

/var/log/www/site1.com/*.log
/var/log/www/site2.ru/*.log
/var/log/www/etc.ru/*.log
{
    # Ежедневная ротация.
    daily
    # Отсутствие файла не является ошибкой.
    missingok
    # Не более 30 логов, т.к. ротация ежедневная, то это история за 30 дней.
    rotate 30
    # Ротируемые файлы сжимаются.
    compress
    # Сжимать предыдущий файл при следующей ротации.
    delaycompress
    # Не обрабатывать пустые файлы.
    notifempty
    # После ротации создать пустой файл с заданными правами и пользователем.
    create 640 root www-data
}

Сохранить такой файл можно с любым именем, например так /etc/logrotate.d/sites. Когда файл создан, то сразу он не активен, логи в соответствии с его настройками не обрабатываются.

Следующая команда помогает убедиться, что файл создан корректно:

<code>logrotate -d /etc/logrotate.d/sites</code>

В данном случае обработки не будет! Вы просто получите информацию о том, какие логи файл настроек затронет и т.д. Если какие-то параметры написаны с ошибкой, то вы это узнаете.

А вот эта команда уже непосредственно запускает ротацию:

<code>logrotate -v -f /etc/logrotate.d/sites</code>

Обработка логов произойдёт тут же. А далее будет происходить автоматически в соответствии с настройками файла.

Если Logrotate не работает

Файл в котором видно последние обработанные логи:

<code>/var/lib/logrotate/status</code>

Запустите ещё раз Logortate в режиме отладки, посмотрите, что он говорит. Вот пример проблемной ситуации:

<code>bash-4.3<span class="token comment"># logrotate -d /etc/logrotate.d/sites</span>
reading config <span class="token function">file</span> /etc/logrotate.d/sites
Handling 1 logs
rotating pattern: /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
 after 1 days <span class="token punctuation">(</span>30 rotations<span class="token punctuation">)</span>
empty log files are not rotated, old logs are removed
considering log /var/log/www/portal.site/access.log
 log does not need rotating
considering log /var/log/www/portal.site/error.log
 log does not need rotating
considering log /var/log/www/portal.dev/access.log
 log does not need rotating
considering log /var/log/www/portal.dev/error.log
 log does not need rotating
not running prerotate script, since no logs will be rotated
not running postrotate script, since no logs were rotated</code>

Файлы логов существуют и растут, Logrotate почему-то не видит их, сообщая что они пустые и не нуждаются в обработке. В итоге ничего не происходит. Почему так? Хз.

Решение: просто удалить все логи из интересующих нас папок, перезапустить Nginx. Подождать пока в логах что-то появится. Ещё раз выполнить команду отладки. На этот раз можно видеть, что ротация логов должна будет работать:

<code>bash-4.3<span class="token comment"># logrotate -d /etc/logrotate.d/sites</span>
reading config <span class="token function">file</span> /etc/logrotate.d/sites
Handling 1 logs
rotating pattern: /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
 after 1 days <span class="token punctuation">(</span>30 rotations<span class="token punctuation">)</span>
empty log files are not rotated, old logs are removed
considering log /var/log/www/portal.site/access.log
 log needs rotating
considering log /var/log/www/portal.site/error.log
 log does not need rotating
considering log /var/log/www/portal.dev/access.log
 log needs rotating
considering log /var/log/www/portal.dev/error.log
 log does not need rotating
rotating log /var/log/www/portal.site/access.log, log-<span class="token operator">></span>rotateCount is 30
dateext suffix <span class="token string">'-20160905'</span>
glob pattern <span class="token string">'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'</span>
previous log /var/log/www/portal.site/access.log.1 does not exist
renaming /var/log/www/portal.site/access.log.30.gz to /var/log/www/portal.site/access.log.31.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 30<span class="token punctuation">)</span>,
renaming /var/log/www/portal.site/access.log.29.gz to /var/log/www/portal.site/access.log.30.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 29<span class="token punctuation">)</span>,
<span class="token punctuation">..</span>.
renaming /var/log/www/portal.site/access.log.0.gz to /var/log/www/portal.site/access.log.1.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 0<span class="token punctuation">)</span>,
rotating log /var/log/www/portal.dev/access.log, log-<span class="token operator">></span>rotateCount is 30
dateext suffix <span class="token string">'-20160905'</span>
glob pattern <span class="token string">'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'</span>
previous log /var/log/www/portal.dev/access.log.1 does not exist
renaming /var/log/www/portal.dev/access.log.30.gz to /var/log/www/portal.dev/access.log.31.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 30<span class="token punctuation">)</span>,
renaming /var/log/www/portal.dev/access.log.29.gz to /var/log/www/portal.dev/access.log.30.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 29<span class="token punctuation">)</span>,
<span class="token punctuation">..</span>.
renaming /var/log/www/portal.dev/access.log.0.gz to /var/log/www/portal.dev/access.log.1.gz <span class="token punctuation">(</span>rotatecount 30, logstart 1, i 0<span class="token punctuation">)</span>,
running prerotate script
running script with arg /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
<span class="token keyword">:</span> <span class="token string">"
 /home/user/serv/hits.sh
"</span>
renaming /var/log/www/portal.site/access.log to /var/log/www/portal.site/access.log.1
creating new /var/log/www/portal.site/access.log mode <span class="token operator">=</span> 0640 uid <span class="token operator">=</span> 0 gid <span class="token operator">=</span> 33
renaming /var/log/www/portal.dev/access.log to /var/log/www/portal.dev/access.log.1
creating new /var/log/www/portal.dev/access.log mode <span class="token operator">=</span> 0640 uid <span class="token operator">=</span> 0 gid <span class="token operator">=</span> 33
running postrotate script
running script with arg /var/log/www/portal.site/*.log
/var/log/www/portal.dev/*.log
<span class="token keyword">:</span> <span class="token string">"
 #[ ! -f /var/run/nginx.pid ] || kill -USR1 <span class="token variable"><span class="token variable">`</span><span class="token function">cat</span> /var/run/nginx.pid<span class="token variable">`</span></span>
"</span>
removing old log /var/log/www/portal.site/access.log.31.gz
error: error opening /var/log/www/portal.site/access.log.31.gz: No such <span class="token function">file</span> or directory</code>

Информация взята - http_//pctuner.club/n/1142

0 комментариев
Написать комментарий