Принудительная ротация логов в ubuntu. Атоматическая ротация логов с помощью утилиты logrotate. Опции общего назначения

Нужно отдать должное возможности ведения лога программами, т.к. в них записывается полезная информация, которая при необходимости может дать знать об активности в системе, тем самым помочь в починке каких-либо неполадок в работе программы. Есть и обратная сторона логов – это их размерность. Если размеры логов достигают больших значений то рано или поздно, как правило, это заканчивается некорректной работой программного обеспечения, не говоря о сложности при попытке прочитать лог.

В качестве примера мы будем использовать , который работает на системе Linux CentOS 7. Большая активность на сайте может порождать большое количество записей в логах. И если размеры логов разрастаются до больших размеров, то как правило , и перестает отвечать на запросы.

На самом деле, проблема переполнения логов программ в системе Linux уже давно решена. Для этих целей существует программа logrotate которая с большой вероятностью уже есть в системе при установке дистрибутива системы. Logrotate говоря простым языком переименовывает файл лога программы, а так же перезапускает программу чтобы создался новый файл лога. Таким образом, файлы логов будут складываться упорядоченно в директории, размерность и максимальное количество файлов так же может быть настроено. Logrotate используется большинством программ в Linux, однако не все знают о том, что разбиением файлов лога занимается именно эта программа.

Теперь давайте начнем с начала, предположим, что у вас не установлен logrotate, и мы его попробуем поставить, для этого выполните команду:

# yum install logrotate

Если вы используете другую версию Linux, к примеру Ubuntu, то команда установки будет выглядеть иначе:

# aptitude install logrotate

После установки logrotate (надеюсь у вас это получилось), мы переходим к конфигурации. Основной файл конфигурации находится тут:

/etc/logrotate.conf

Файлы конфигурации для журналирования логов программ стоит размещать в директории /etc/logrotate.d. Именовать файл конфигурации рекомендуется таким образом, чтобы было понятно для какой программы он предназначен.

# vi /etc/logrotate.d/example

В качестве example мы зададим httpd, таким образом, мы получаем:

# vi /etc/logrotate.d/httpd

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

Пример файла конфигурации для ротации логов веб-сервера Apache:

/var/www/*.log { weekly compress delaycompress notifempty missingok rotate 5 create 644 root root postrotate service httpd restart > /dev/null endscript }

Опции:
weekly — регулярность ротации - ротация раз в неделю, возможна иная периодичность: daily, monthly;
compress — сжимать копию лога, по умолчанию для этого используется архиватор gzip, хотя можно прицепить и какой-то внешний;
delaycompress — сжимать последнюю копию только при следующей ротации, это удобно, потому что самые свежие логи не придётся разархивировать;
notifempty — не ротировать лог, если он пуст;
missingok — не проверять наличие файла (если лога нет, то ничего страшного);
rotate 24 — количество сохраняемых копий, мне вот хватает данных и за последние полгода
mail [email protected] — отправляет свежую созданную копию на указанный e-mail, не всегда практично при больших размерах логов
create 644 root root — сразу после ротации старого создать новый пустой лог, указываются, соответственно, права доступа, юзер и группа файла
postrotate/endscript – действие, выполняемое после ротации логов, в нашем случае перезагрузка httpd сервера;
size – можно указать размер вместо weekly, например size 10M – в этом случае лог будет писаться в файл до того момента пока он не превысит 10-мегабайт.

После того как файл вы указали настройки для ротации логов, самое время проверить корректность файла конфигурации. Проверяется таким образом:

# logrotate -d /etc/logrotate.d/httpd

Ключ –d указывает на эмуляцию работы программы ротации логов, при этом логи затрагиваться не будут, а на экран будут выводиться диагностические сообщения.

Если всё в порядке, можно запустить утилиту в боевом режиме:

# logrotate -v -f /etc/logrotate.d/httpd

После выполнения команды, будет включена ротация логов сервера, раз в неделю (об этом указывает параметр weekly), количество файлов-логов будет 5 шт. (параметр rotate 5). Информацию о том, что и когда было в ротации программой logrotate можно посмотреть в файле:

/var/lib/logrotate/status

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

Logrotate является отличной утилитой для управления log-файлами в системе. Утилита позволяет в автоматическом режиме архивировать, удалять и рассылать файлы на e-mail. Каждый log-файл может обрабатываться ежедневно, еженедельно, ежемесячно или по достижению выставленного объёма. Обычно logrotate запускается ежедневно службой cron.


Logrotate имеет свой конфигурационный файл /etc/logrotate.conf в котором описаны глобальные параметры, которые будут применяться по умолчанию, в нем как правило подключается директория include /etc/logrotate.d , откуда подгружаются дополнительные конфигурационные файлы с описанием правил для конкретных log-файлов.


Пример главного конфигурационного файла /etc/logrotate.conf

# ротировать каждую неделю weekly # хранить 4 log-файла rotate 4 # создать новый пустой log-файл create # сжимать log-файлы compress # подключить файлы с описанием правил для конкретных лог файлов include /etc/logrotate.d # запустить ротацию wtmp и btmp из основного файла конфигурации /var/log/wtmp { monthly minsize 1M create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly minsize 1M create 0600 root utmp rotate 1 }

Пример файла конфигурации для apache2, находящегося в каталоге /etc/logrotate.d/, выглядит следующим образом:

/var/log/httpd/site1/*log /var/log/httpd/site2/error.log { missingok # отсутствие файла не является ошибкой notifempty # не обрабатывать пустые файлы sharedscripts # скрипты prerotate/postrotate будут выполнены только один раз postrotate # скрипт будет выполнен сразу после ротации /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript }

Базовым элементом конфигурационного файла является секция. Описание секции начинается с указания файлов над которыми будет производится ротация, (в нашем случае это файлы находящихся в директории /var/log/httpd/site1/ и имеющие расширение "log" или конкретные файлы /var/log/httpd/site2/error.log), а параметры указываются в фигурных скобах.


В файле /var/lib/logrotate.status можно посмотреть что и когда последний раз ротировалось.

ОСНОВНЫЕ ОПЦИИ LOGROTATE:

  • -d Всключает режим отладки, а так же дублирует опциию -v. В режиме отладки не будут производиться изменения в log-файле и файле состояния
  • -f, --force Принудительно произвести ротацию, даже если в данный момент она не требуется
  • -m, --mail command Указать команду для отправки почты. Команда должна принимать 2 входных параметра: заголовок письма и получателя письма. Текст письма передается стандартным вводом (stdin). По умолчанию /usr/bin/mail -s
  • -s, --state statefile Указать куда записать файл состояния. Полезно в случаях, когда logrotate работает от имени разных пользователей для различных наборов лог-файлов. По умолчанию /var/lib/logrotate/status
  • --usage Выводит краткую инструкцию по использованию утилиты.
  • -v, --verbose Выводит отладочную информацию.

СПИСОК ПАРАМЕТРОВ:

rotate число Количество хранимых файлов daily Производить ротацию логов раз в день weekly Производить ротацию логов раз в неделю monthly Производить ротацию логов раз в месяц size размер Производить ротацию если log-файл превысил указанный размер (байт, Кбайт, Мбайт) start число Число с которого начнётся нумерация файлов compress Архивировать файлы (по умолчанию gzip) nocompress Отключает compress delaycompress Не сжимать "свеже" созданный архив. Например access.log.1 не будет зжат. Используется с compress. nodelaycompress Не откладывать сжатие файла на следующий цикл compresscmd Позволяет указать команду для сжатия файлов. По умолчанию gzip uncompresscmd Директива позволяет указать команду для декомпрессии файлов. По умолчанию gunzip compressext Если используется сжатие, задает расширение сжатых файлов. compressoptions Задает параметры сжатия, по умолчанию - "-9", т.е. максимальное сжатие для gzip create права владелец группа После ротации создать пустой log-файл. Любые из этих атрибутов могут быть опущены, в этом случае вместо них для нового файла будут использованы атрибуты, имеющие те же значения, что и первоначальный log-файл nocreate Не создавать новый файл copy Создать копию оригинального log-файла, не изменяя его. Исключает create nocopy Не копировать исходный файл copytruncate Создать копию оригинального log-файла, а потом его "обнулить". Таким образом сам файл не удаляется. Исключает copy, create nocopytruncate После создания копии, не обрезать исходный файл журнала в его штатном местоположении ifempty Архивирует даже пустой файл (используется по умолчанию) notifempty Не архивировать пустые файлы missingok В случае отсутствия оригинального log-файла не вызовет ошибку nomissingok В случае отсутствия оригинального log-файла вызовет ошибку prerotate команды endscript Строки, находящиеся между postrotate и endscript будут выполнены как sh скрипт до начала архивирования log-файла postrotate команды endscript Строки, находящиеся между postrotate и endscript будут выполнены как sh скрипт после архивирования log-файла sharedscripts Скрипты postrotate и prerotate будут выполнены только один раз в рамках своей секции. nosharedscripts Отключает sharedscripts. Скрипты будут выполняются при ротации каждого log-файла, при определение /var/log/apache2/*.log скрипт будет выполнен столько раз сколько уникальных log-файлов будет находится в данной директории olddir directory Перемещать архивные файлы в указанную директорию noolddir Отключает olddir dateext К имени файлов журналов добавляется дата (%Y%m%d), вместо номера extension расширение Финальное расширение ext, которое дается лог-файлу после ротации. mail адрес Когда смена версий приводит к необходимости удалить старый журнал, то послать его по указанному адресу mailfirst Посылать не удаляемую версию журнала, а первую maillast Посылать удаляемую версию журнала; действует по умолчанию nomail Не отправлять файлы журналов почтой. include файл_или_каталог Читает файл, переданный в качестве аргумента, так, как будто он включен построчно в тело конфигурационного файла с того места, где указана директива include. Если задан каталог, то содержащиеся в нём файлы будут прочитаны в алфавитном порядке, прежде чем переданы на обработку для включения. tabooext [+] список_расширений Изменяет текущий список запрещённых расширений (см. include). Если списку расширений предшествует знак +, то этот список прибавится к текущему, иначе заместит его.

Logrotate – это программа которая дает возможность управлять логами в системы Unix/Linux. Утилита выполняет автоматическую ротацию, удаление или сжатие логов. Logrotate помогает сохранять место на диске. Утилиту довольно просто настроить и сейчас, вы убедитесь в этом.

Установка Logrotate для управления логами в Unix/Linux

Я приведу наглядные примеры использования на различных Unix/Linux ОС.

Установка Logrotate для управления логами в Debian/Ubuntu

Обновим пакеты в ОС:

# apt-get update -y

Для установки используем:

# apt-get install logrotate -y

Установка Logrotate для управления логами в CentOS/Fedora/RedHat

Обновим пакеты в ОС:

# yum update -y

Для установки используем:

# yum install logrotate -y

После чего, переходим к настройке и запуску логротейта.

Установка Logrotate для управления логами в Mac OS X

Выполняем установку HomeBrew — и, выполним поиск пакета:

$ brew search logrotate

Для установки, служит команда:

$ brew install logrotate

После чего, переходим к настройке и запуску logrotate.

Настройка Logrotate для управления логами в Unix/Linux

Конфигурационный файл можно найти в:

# vim /etc/logrotate.conf

Мой конфиг выглядит следующим образом:

Weekly create rotate 4 dateext include /etc/logrotate.d /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 }

Логи уровня приложения (заменяющие настройки по умолчанию в случае необходимости) хранятся в:

/etc/logrotate.d/

Я не буду заморачиваться и пропишу один конфиг для всей ротации (можно настраивать для каждого отдельно):

# vim /etc/logrotate.d/For_ALL

Прописываем:

/var/log/*.log { monthly size 100M rotate 7 compress delaycompress missingok notifempty create 644 root root }

Я беру все логи которые имеют любое название и заканчиваются на.log и отслеживаю их в интервале — месяц (служит директива monthly). Если превышает размер лога (size 100M), то выполнить ротацию Ротация происходит после 7 дней (файлы сохраняются 7 дней). Лог-файлы я сжимаю (директива compress). Опция delaycompress задерживает выполнение сжатия до следующей ротации логов, но она работает только с параметром — compress. Параметр missingok дает возможность обрабатывать следующий лог если какой-то отсутствует и не выдавая об ошибке. С опций notifempty можно запретить ротацию пустых файлов. После ротации логов, все будет удалено и чтобы выполнялось сохранение логов, нужно создать файлы снова. Так вот, create позволяет это делать.

Если в конфиге используется опция size и интервал ротации (например, monthly), то именно опция size превзойдет опцию интервала ротации, — это означает что что логи будут ротироваться, как только размер файла превысит указанное значение, не дожидаясь истечения срока.

После чего, можно выполнить проверку того, что создали (без его выполнения, только тест):

# logrotate -d /etc/logrotate.d/For_ALL

Если отладка не показала ничего плохого, можно запустить ротацию:

# logrotate -f -v /etc/logrotate.d/For_ALL

Вместо того, чтобы сжимать логи, можно переименовать их. Для этого есть директива dateext. Если наш формат даты отличается от yyyymmdd по умолчанию, мы можем указать его с помощью dateformat:

Dateext dateformat -%d%m%Y notifempty

Так же, можно по окончанию, отправить письмо на указанный емейл:

Mail mail_user@сайт

Если не хотите чтобы создавались пустые файлы после ротации, используйте:

Nocreate

Не откладывать сжатие файла на следующий цикл

Nodelaycompress

Если не хотите отправлять старые логи на почту, то юзайте:

Сохранять все логи в одной и той же папке:

Noolddir

Интервалы для ротации:

Daily weekly monthly yearly

Размеры для ротации (после превышения указанного размера, будет выполнятся ротация):

Size 6k size 66M size 66G

Можно посылать произвольные команды после выполнения ротации, например:

Postrotate echo "Ротация выполнена!" | mail root endscript

Данную утилиту, нужно запускать:

# logrotate /etc/logrotate.d/For_ALL

Можно автоматизировать и закинуть «logrotate» команду в crontab.

PS: По умолчанию, это возможно уже сделано:

# ls /etc/cron.daily/ cups logrotate makewhatis.cron mlocate.cron prelink readahead.cron tmpwatch

Например, файл конфигурации для apache2 выглядит следующим образом:

/var/log/apache2/*.log { weekly missingok rotate 2 compress delaycompress notifempty create 640 root root sharedscripts postrotate if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then /etc/init.d/apache2 reload > /dev/null fi endscript }

Ротация производится раз в неделю. При отсутствии лога — не выводить ошибку. Сохранять 2 последних ротированных фалов и конечно же, сжимать их, но для пустых файлов никаких действий не выполнять. После того, как ротация прошла, создавать пустой файл с указанными правами.

Опции Logrotate

Наиболее часто использующиеся опции:

D — Данная опция, дает возможность включить отладочный режим, который использует «-v» параметр. В этом режиме, ничего не будет выполнятся и применятся.

F, —force — Данная опция, дает возможность принудительно запустить logrotate и запустить ротацию логов. Иногда бывает полезным, например — когда добавили новый функционал в конфиг или старые логи удалены вручную и чтобы не создавать новые файлы вручную, можно запустить логротейт с данной опцией.

M, —mail command — Позволяет указывать команду для отправки лог-файлов по почте и она должна содержать входные параметры:

  • заголовок письма
  • получателя письма

После выполнения, логи будут отправлены на указанное мыло (команда читает данные со стандартного входа STDIN), а командой по умолчанию — /usr/bin/mail -s.

S, —state statefile — Данная опция позволяет задавать произвольный файл с состоянием. Это хорошо использовать тогда, когда в системе имеется несколько пользователей, которые работают (запускают) с logrotate. По умолчанию, данный фал сохраняется в /var/lib/logrotate/status.

—usage — Показать мануал по использованию данной утилиты.

V, —verbose — Данная опция, позволяет выводит все происходящее на экран (весь вывод).

Вот и все, статья «Установка Logrotate для управления логами в Unix/Linux» завершена!

У меня стояла задача: настроить сжатие логов DNS сервера Unbound, с возможностью удобного сбора этих бэкапов в коллектор. Также требовалось ограничить права доступа, чтобы с коллектора можно было зайти только в дирректорию, где хранятся бэкапы логов. Указанные действия проводил на CentOS 7 Minimal и CentOS 6.6 Minimal.

1) Сперва создаем группу пользователей, для которой будет ограничен доступ только по SFTP:

Vi /etc/ssh/sshd_config
Требуется в самом конце закомментировать строку #Subsystem sftp /usr/libexec/openssh/sftp-server и ограничить доступ для группы пользователей sftpd только по SFTP и только в домашнюю директорию. Для этого нужно добавить в конце следующие строки:

Subsystem sftp internal-sftp Match group sftpd ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
Перезагружаем ssh:

Service sshd restart
3) Создаем пользователя dnslog, назначаем ему домашнюю папку и права на эту папку. Владелец должен быть root, никто другой не должен иметь прав на запись в эту папку, иначе ничего не получится:

Adduser -d /home/dnslog -s /sbin/nologin dnslog -g sftpd passwd dnslog
chown root /home/dnslog chmod 750 /home/dnslog
4) Создаем папку, внутри домашней директории нашего пользователя, для которой у logrotate будут права на запись.

Mkdir /home/dnslog/logs chown dnslog /home/dnslog/logs chmod 775 /home/dnslog/logs
Доступ для коллектора организован, теперь можно подключиться по SFTP и проверить, что все работает. Далее настроим ротацию логов:

5) Создаем в папке /etc/logrotate.d/ файл, в котором будут прописаны настройки ротации наших логов.

Vi /etc/logrotate.d/unbound_logrotate
Настройки примерно такие:

/var/log/unbound/unbound.log { daily rotate 48 missingok notifempty compress olddir /home/dnslog/logs size 1024M postrotate service rsyslog restart > /dev/null unbound-control log_reopen #Переоткрываем файл логов, иначе лог не будет писаться после ротации endscript }
Далее я установил время ротации через крон.

23 * * * * root run-parts /etc/cron.hourly

И перезагружаем крон:
service crond restart
Ротация будет осуществляться каждый час в 23 минуты.

7) В папке /etc/cron.hourly/ создаем файл с любым именем, где пишем скрипт, который будет выполняться при наступлении времени ротации, с таким содержимым:

/usr/sbin/logrotate /etc/logrotate.conf

Вот и все. Логи будут автоматически складываться в папку /home/dnslog/logs/

Проверить настройки ротации можно командой:

Logrotate -d /etc/logrotate.conf

Также, стоит отметить, что в Unbound существует два способа ведения логов: средствами Unbound и через syslog. Через syslog - лучший способ, так как не так тормозит работу Unbound. В указанном примере описана ротация логов средствами Unbound. Чтобы настроить логгирование через syslog, в конфигурации Unbound нужно включить параметр:
use-syslog: yes
А также немного переписать файл /etc/logrotate.d/unbound_logrotate
/var/log/messages { daily rotate 48 missingok notifempty compress size 1024M olddir /home/dnslog/logs create postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true chown dnslog /home/dnslog/logs/messages* chmod 775 /home/dnslog/logs/messages* endscript }

Логи (или журналы) хранят в себе ценную информацию, позволяющую понять, что, когда и как происходило в системе. Логи веб-сервера - это ещё и важный источник данных для аналитики (ну, там, исследование аудитории веб-ресурса, определение основных источников трафика и прочее, хотя сегодня для подобных целей мало серверных логов, надо ещё подключать Google Analytics и Яндекс.Метрику). Но есть проблема: если на веб-ресурс ходит немало посетителей (или если система долго трудится без присмотра администратора), то логи вырастают до гигантских объемов.

Для того, чтобы однажды диск столь «самостоятельной» системы не переполнился логами под завязку и эту самую стабильную систему не завалил, надо логи периодически подчищать. Но удалять их вручную или по планировщику - плохая идея, ведь самые свежие (последние добавленные) данные из логов, как правило, действительно нужны для мониторинга системы или веб-сайта. Перед удалением надо как-то сохранять последние версии логов. Процесс сохранения нескольких копий логов с удалением самой старой при создании самой новой копии - называется ротацией. Задача типовая, а потому для ротации логов есть несколько известных инструментов, но я остановился на logrotate .

Итак, устанавливаем:
aptitude install logrotate

Итак, в новом файле мы должны описать что ротировать и как. Синтаксис чем-то похож, например, на описание виртуальных хостов nginx (и вообще такой синтаксис много где встречается). Предполагается, что лог-файлы вашего сайта лежат в /var/www/access.log и /var/www/error.log , если это нитак, то вы уж поменяйте путь в первой строке конфига.

Итак, конфигурация:

/var/www/*.log {
weekly # регулярность ротации - ротация раз в неделю, возможна иная периодичность: daily, monthly
compress # сжимать копию лога, по умолчанию для этого используется архиватор gzip, хотя можно прицепить и какой-то внешний
delaycompress # сжимать последнюю копию только при следующей ротации, это удобно, потому что самые свежие логи не придётся разархивировать
notifempty # не ротировать лог, если он пуст
missingok # не проверять наличие файла (если лога нет, то ничего страшного)
rotate 24 # количество сохраняемых копий, мне вот хватает данных и за последние полгода
mail [email protected] # отправляет свежую созданную копию на указанный e-mail, я этим не пользуюсь, но опция полезная для любителей сохранять всё ненужное на gmail`е, следите только за тем, чтоб лог пролезал в ваш ящик
create 644 root root # сразу после ротации старого создать новый пустой лог, указываются, соответственно, права доступа, юзер и группа файла
sharedscripts # запустить скрипт или утилиту после ротации всех логов
postrotate # выполнить далее указанный скрипт сразу после ротации
apache2ctl restart > /dev/null # перезапустим apache
endscript # признак окончания вызова скрипта
}

Вместо
weekly
можно было указать
size 10M
тогда лог будет ротироваться вне зависимости от регулярности, но на основе своего размера: ротироваться будет лог по объему больший или равный 10 мегабайтам. Какой вариант более подходит вам - решайте сами. Но учтите, что при регулярной ротации, вам надо хотя бы примерно прикинуть максимальный размер лога, умножить его на количество сохраняых копий и убедится, что места у вас на диске хватит и останется (иначе вся ротация смысл теряет).

Теперь давайте протестируем, удачно ли создан конфиг:
logrotate -d /etc/logrotate.d/example

С ключом -d программа будет только эмулировать полезную активность, выводя вам на экран диагностические сообщения (реально она логи не тронет).

Если всё в порядке, то запускайте утилиту в боевом режиме:
logrotate -v -f /etc/logrotate.d/example

И всё, логи будут ротироваться (руками в cron ничего добавлять не надо, всё будет сделано за вас).

В файл /var/lib/logrotate/status станет записывать информация о том, что и когда ротировал logrotate .



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: