Logrotate: настройка ротации логов. Опции, связанные с датами. Опции сжатия логов

Развернутый мною Squid по данной статье, успешно работает. Но столкнулся с такой ситуацией что сразу не понял почему логи Squid хранятся крайне мало и для детального анализа трафика проходящего в компании не достаточно.

По умолчанию ротация логов в Squid выставлена всего на три дня, поэтому яразобрался как увеличить срок жизни логов и выставить ротацию логов в период одного месяца. В моем случае этого достаточно.

Осуществлять ротацию логов мы будем с помощью системной службы logrotate , входящей в состав Ubuntu Server 14.04 .

Заметка: Ротация логов осуществляет периодическую замену старых логов новыми, помещая устаревшие данные в архив или просто удаляя их. В зависимости от настроек архив логов может храниться как в сжатом, так и в несжатом виде и иметь необходимую глубину.

Основные настройки logrotate хранятся в /etc/logrotate.conf , настройки отдельных сервисов (в нашем случае Squid ) хранятся в /etc/logrotate.d/squid , и эти настройки имеют приоритет над logrotate.conf . Сама служба вызывается раз в сутки через планировщик cron .

Нас интересует ротация логов только двух файлов access.log и cache.log . Для файла access.log мы будем раз в месяц выполнять ротацию, а для файла cache.log раз в неделю. Откроем для редактирования файл конфигурации

Sudo nano /etc/logrotate.d/squid

Приведем файл настройки ротации логов для Squid в вид который нам нужно.

# Ежемесячная ротация лог-файла accesss.log /var/log/squid/access.log { # daily # weekly monthly compress delaycompress rotate 2 missingok nocreate sharedscripts postrotate test ! -e /var/run/squid.pid || test ! -x /usr/sbin/squid || /usr/sbin/squid -$ endscript } # Еженедельная ротация лог-файла cache.log /var/log/squid/cache.log { # daily weekly # monthly compress delaycompress rotate 1 missingok nocreate sharedscripts postrotate test ! -e /var/run/squid.pid || test ! -x /usr/sbin/squid || /usr/sbin/squid -$ endscript }

Разберем структуру написанного выше подробнее. Первая строка указывает путь к обрабатываемым файлам логов. В данном случае обрабатываются файлы access.log и cache.log в соответствии с указанными ниже опциями:

Daily - задает ежедневную ротацию weekly - задает еженедельную ротацию monthly - задает ежемесячную ротацию compress - указывает сжимать архивные логи, обратная опция nocompress. delaycompress - не сжимать текущий лог до следующей ротации, обычно используется в тех случаях, когда в лог происходит непрерывная запись. rotate 2 - количество ротаций до удаления файла, в данном случае будут храниться два архива. missingok - при отсутствии файла журнала указывает продолжить работу без вывода сообщения об ошибке. nocreate - не создавать новый файл лога. sharedscripts - используется для секций prerotate и postrotate, данная опция указывает исполнять скрипты из этих секций один раз перед и после ротации всех логов, в противном случае скрипты будут исполнены перед и после ротации каждого лога. Секция postrotate проверяет, запущен ли squid и запускает ротацию логов самим прокси сервером.

Дополнение : Еще возможна секция prerotate , она добавляется автоматически при установке анализатора логов SARG и в случае если файл /usr/sbin/sarg-reports существует и является исполняемым, запускает его. В моем случае запускается по cron, поэтому я исключил его из конфигурации.

Т.к. мы ротацию будем осуществлять исключительно службой logrotate , то поправим конфигурацию squid

Sudo nano /etc/squid/squid.conf

Находим строку logfile_rotate 6 (или добавляем ее в случае ее отсутствия). И приводим к виду

logfile_rotate 0

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

Сохраняем Ctrl+O и закрываем Ctrl+X файл.

Перезапускаем Squid, новые настройки вступят в силу. Вот так легко и просто настраивается ротация логов.

Как то тут на днях столкнулся с проблемой, SAMS как оказалось не отображает статистику за последнии 6 месяцев. Начав разбираться что с ним случилось выяснил что файл логов squid -а (access.log ) был большого размера ~ 20 GB. Немного почитав и поизучав с чем это может быть связано, пришел к выводу что для SAMS файл лога слишком большой и записи из лога не переносяться в базу. Значит надо сделать так чтобы лог не разрастался до таких размеров т.е. настроить ротацию логов sqiud -а. Ну так приступим. Для начала я проверил есть ли в системе logrotate . Выполнив команду whereis logrotate получил в ответ /usr/ports/sysutils/logrotate что указывало на то что logrotate в системе нет. Значит придеться установить. Выполняем следующую последовательность команд:

# cd /usr/ports/sysutils/logrotate/
make
# make install

После окончания установки logrotate перейдем к настройки программы. Файл настроек logrotate находиться в папке /usr/local/etc/. Файл настроек называется logroate.conf.sample. Переименуем файл путем копирования его в файл logrotate.conf :

# cd /usr/local/etc/
# ls
apache php.ini-dist slsh.rc
logrotate.conf.sample php.ini-recommended squid
pam.d rc.d supfile
php sams.conf xml2Conf.sh
php.conf sams.conf.sample xsltConf.sh
php.ini sams.core
# cp logrotate.conf.sample logrotate.conf
#

Приступим к настройке. Вид стандартного файла такой:

# see «man logrotate» for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
compress
# RPM packages drop log rotation information into this directory
include /usr/local/etc/logrotate.d
/var/log/lastlog {
monthly
rotate 1
}
# system-specific logs may be configured here

Основной лог squid -а это файл access.log который находиться в папке /usr/local/squid/logs. Соотвественно добавляем в файл конфигурации следующие строки:

/usr/local/squid/logs/access.log { #— ротацию какого лог файла будем выполнять
monthly #— как часто выполнять ротацию лога — раз в месяц
rotate 5 #— сколько предыдущих версий хранить
copytruncate
nocompress
notifempty
missingok
sharedscripts
postrotate #— команда которую необходимо выполнить после ротации

/usr/local/etc/rc.d/squid restart#— сама команда переконфигурирования squid -а
endscript
}
Ну вот вроде и все про ротацию логов.

P.S.: Еще надо настроить запуск logrotate по расписанию, для этого идем в папку /etc и редактируем файл crontab добавляя туда следующую запись:
# Run logrotate every first day of the month
0 0 1 * * root /usr/local/sbin/logrotate -f /usr/local/etc/logrotate.conf

Как показал читательский отклик - ротация логов одна из тем, вызывающих некоторое затруднение. В частности возникают проблемы с настройкой ротации логов прокси сервера squid, что затрудняет получение отчетов за длительный период. Поэтому мы решили внести ясность и рассказать, что такое ротация логов и как ее настроить.

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

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

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

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

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

Такой подход позволяет гибко настроить ротацию для каждой конкретной службы, не затрагивая общих настроек. Сама служба вызывается раз в сутки через планировщик cron .

Откроем файл /etc/logrotate.d/squid , у нас он имеет следующий вид:

#
#Logrotate fragnment for squid.
#
/var/log/squid/*.log {
daily
compress
delaycompress
rotate 2
missingok
nocreate
sharedscripts
prerotate
test ! -x /usr/sbin/sarg-reports || /usr/sbin/sarg-reports
endscript
postrotate
test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate
endscript
}

Разберем его структуру подробнее. Первая строка указывает путь к обрабатываемым файлам логов. В данном случае обрабатываются все файлы в директории /var/log/squid в соответствии с указанными ниже опциями:

  • daily - задает ежедневную ротацию, для еженедельной или ежемесячной используйте weekly или monthly .
  • compress - указывает сжимать архивные логи, обратная опция nocompress .
  • delaycompress - не сжимать текущий лог до следующей ротации, обычно используется в тех случаях, когда в лог происходит непрерывная запись.
  • rotate 2 - количество ротаций до удаления файла, в данном случае будут храниться два архива.
  • missingok - при отсутствии файла журнала указывает продолжить работу без вывода сообщения об ошибке.
  • nocreate - не создавать новый файл лога.
  • sharedscripts - используется для секций prerotate и postrotate , данная опция указывает исполнять скрипты из этих секций один раз перед и после ротации всех логов, в противном случае скрипты будут исполнены перед и после ротации каждого лога.

Ниже идут секции prerotate и postrotate , каждая из которых заканчивается строкой endscript , все что расположено между этих строк исполняется перед и после процесса ротации.

Секция postrotate проверяет, запущен ли squid и запускает ротацию логов самим прокси сервером. Остановимся на этом моменте немного подробнее. В конфигурационном файле squid имеется опция:

Logfile_rotate n

где n - число ротаций (по умолчанию 0), т.е. сам squid может хранить несколько ротаций логов, каждая из которых будет в свою очередь обрабатываться logrotate. При настройках по умолчанию данная команда приводит к очистке основного лога squid.

Секция prerotate добавлена автоматически при установке и в случае если файл /usr/sbin/sarg-reports существует и является исполняемым, запускает его.

Отдельно следует остановиться на записи команд, используемая в них конструкция может быть непонятна с первого раза. В данном случае используется двойное отрицание, если отрицание условия ложно, то выполняется команда указанная за символом || (логическое ИЛИ), это связано с логикой работы команды test и синтаксисом записи файла (восклицательный знак после test указывает на отрицание условия).

Как видим logrotate позволяет весьма гибко настраивать процесс ротации логов. Так если мы хотим формировать статистику использования squid помесячно, то должны указать период ротации - месяц и в секции prerotate изменить команду для формирования месячного отчета.

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

Конфигурация logrotate

Конфигурация logrotate разделена на части. Основная часть обычно хранится в файле /etc/logrotate.conf. В этом файле могут присутствовать секции для ротации логов, а также директива «include /etc/logrotate.d», подключающая конфигурационные файлы из директории /etc/logrotate.d. Таким образом, для создания нового задания ротации вам достаточно создать конфигурационный файл и поместить его в эту директорию. Название файла желательно задавать такое же, как и название сервиса, логи которого будут ротироваться.

Вот пример конфигурационного файла /etc/logrotate.conf:

# rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we"ll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 }

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

Каждый файл в директории /etc/logrotate.d может включать одну или несколько секций. Каждая секция выглядит в общем виде так:

Название-файла-лога { параметры ротации }

Параметры ротации — это именно то, что обеспечивает гибкость ротации. У logrotate достаточно много опций, но их можно разбить на несколько групп. Вот опции, которые могут быть использованы в конфигурационных файлах:

Опции, определяющие интервал ротации:

Опции сжатия логов:

compress Сжимать логи при ротации. По умолчанию для сжатия используется gzip
compresscmd Команда/программа, которая будет использоваться для сжатия логов
compressoptions Опции команды ротации, которые будут использоваться при сжатии логов
uncompresscmd Команда разархивации логов. По умолчанию gunzip
compressext Указать расширение файлов, которое будет указываться для сжатых логов
delaycompress Отложить сжатие лога до следующей ротации. Таким образом последняя версия лога после ротации будет несжатой, а более ранние — сжатыми
nocompress Не сжимать логи при ротации
nodelaycompress Не откладывать сжатие до следующей итерации ротации. Эта опция перегружает опцию delaycompress

Опции копирования:

copy Копировать лог-файл, но не изменять оригинал. Эту опцию можно использовать, когда надо создать снимок лога на определенный момент, вместо ротации, либо когда для усечения лога используется внешняя программа. Если используется опция copy, то опция create, если она указана, не будет иметь никакого эффекта, так как старый лог остается.
copytruncate Урезать оригинальный файл до нулевого размера после создания копии вместо переименования оригинального файла и создания нового. Эта опция используется тогда, когда программе, записывающей лог, нельзя указать, что нужно закрыть связанный с файлом лога дескриптор и открыть новый. Такая программа может продолжать писать в старый файл. При использовании этой опции есть один момент, связанный с тем, что на копирование требуется некоторое время и поэтому файл не может быть скопирован мгновенно. За время копирования в лог могут быть добавлены записи, которые будут утеряны при усечении файла до нулевого размера. При использовании этой опции опция create также не будет иметь эффекта, так как старый файл остается на месте
nocopy Не копировать оригинальный лог-файл. Эта опция перегружает опцию copy
nocopytruncate Не усекать оригинальный лог-файл после создания копии. Эта опция перегружает опцию copytruncate

Опции создания нового лог-файла (после ротации старого):

create права владелец группа
create владелец группа
Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла
nocreate Новые лог-файлы не создаются. Эта опция перегружает опцию create

Опции, связанные с удалением файла лога:

Опции, связанные с датами:

dateext Использовать в названии старых лог-файлов дату вместо номера. При использовании номера названия выглядят так: logfile.1.gz, logfile.2.gz и так далее
nodateext Не использовать дату в названиях старых лог-файлов. Эта опция перегружает опцию dateext
dateformat форматная-строка Указать форматную строку для даты, которая будет добавляться к названию лога. Форматная строка похожа на используемую в команде date, но допустимы только шаблоны %Y(четырехзначный номер года), %m(двузначный номер месяца), %d(двузначный номер дня месяца) и %s(unix time, количество секунд с 00:00 01.01.1970). Значение по умолчанию «-%Y%m%d», минус также включен в шаблон, при задании шаблона его можно упустить. Нужно отметить, что logrotate использует сортировку для определения более старых файлов, которые необходимо удалить, поэтому строка даты должна учитывать корректную сортировку. Именно поэтому вначале пишется обычно год, затем месяц и только затем день.
dateyesterday Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива

Опции, связанные с рассылкой логов:

Опции, связанные с размером и существованием файла лога:

maxsize размер Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла.
minsize размер Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly)
size размер Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M — в мегабайтах, если G — в гигабайтах. Например, 1G или 10M.
ifempty Ротировать файл лога, даже если он пуст. Используется по умолчанию.
notifempty Не ротировать файл лога, если он пуст. Перегружает опцию ifempty.
missingok Если файл лога отсутствует, перейти к следующему без сообщения об ошибке
nomissingok Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию.

Опции, связанные с директориями, в которых хранятся логи:

Файлы настроек для logrotate позволяют выполнять скрипты в процессе ротации логов. Таким образом можно выполнить какие-то действия на каждом этапе ротации.

Опции выполнения скриптов:

postrotate/endscript Строки, находящиеся между словами postrotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh после ротации файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов. Таким образом можно выполнить скрипт для всех файлов сразу
prerotate/endscript Строки, находящиеся между словами prerotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед ротацией файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов.
sharedscripts В обычном режиме скрипты выполняются по одному разу на каждый файл, указанный для ротации. Таким образом скрипты могут быть выполнены несколько раз, по разу для каждого файла, указанного для ротации. Если указана директива sharedscripts, то скрипты выполняются по одному разу, но в качестве аргументов им передается список файлов. Если же ни один файл лога не ротируется, скрипты выполнены не будут. Если в процессе выполнения скрипта возникнет ошибка, то действие не будет завершено для всех логов.
nosharedscripts Запускать prerotate и postrotate скрипты для каждого лога, который ротируется. Это значение по умолчанию, кроме того, эта директива перегружает sharedscripts. Скриптам передается абсолютный путь к файлам логов. Если во время выполнения скрипта возникнет ошибка, то действие не будет завершено только для одного текущего файла лога.
preremove/endscript Строки, находящиеся между словами preremove и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед удалением старого файла лога. logrotate передаст название файла, который будет удален, скрипту в качестве аргумента
firstaction/endscript Строки, находящиеся между словами firstaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз до того, как лог-файлы будут ротированы и еще до того, как будет выполнена секция prerotate. Это произойдет только в том случае, если хотя бы один лог-файл будет действительно ротироваться. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.
lastaction/endscript Строки, находящиеся между словами lastaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз только после того, как лог-файлы будут ротированы и даже после того, как будет выполнена секция postrotate. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.

Опции общего назначения:

extention расширение Лог-файлы с указанным расширением могут сохранять его после ротации. Если используется компрессия, то расширение с типом архива (обычно.gz) появляется после расширения. Например, если у вас файл лога называется mylog.foo и вы хотите получить при ротации файл mylog.1.foo.gz, а не mylog.foo.1.gz
rotate количество Лог-файлы ротируются указанное количество раз до удаления или отправки на адрес, указанный в директиве mail. Если количество равно 0, старые версии просто удаляются вместо ротации.
start номер Указать номер, используемый как база для нумерации при ротации. Например, если вы указываете 0, то оригинальный файл будет ротироваться в файл с окончанием.0, и далее по увеличению, если указать 9, то нумерация начнется с.9. Файлы в любом случае будут ротироваться такое количество раз, которое указано в директиве count.
su пользователь группа Выполнять ротацию логов под указанным пользователем и группой вместо пользователя по умолчанию (обычно root). Если у пользователи или группы недостаточно прав для осуществления ротации, возникнет ошибка.
include файл-или-директория logrotate считывает указанный файл и вставляет его как есть в конфигурационный файл в место вставки директивы include. Если указана директория, файлы из нее сортируются по алфавиту и затем вставляются в конфигурацию. При этом, если файлы не являются обычными файлами, они игнорируются. Это могут быть, например, именованные пайпы или директории. Также игнорируются файлы, имеющие расширения, указанные в директории tabooext.
tabooext [+] список Изменение текущего списка игнорируемых расширений. Если перед списком стоит +, то текущий список дополняется указанным. Если + не указан, то список заменяется. По умолчанию список изначально включает следующие расширения: .rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-*

И напоследок простой пример.

/var/log/mydaemon/mydaemon.log /var/log/mydaemon/error.log{ # Ежедневная ротация daily # Начинать нумерацию с 0 start 0 # Ротировать 30 раз до удаления rotate 30 # Не генерировать ошибку, если файла лога нет missingok # Удалять логи при помощи команды shred shred # Делать 3 цикла перезаписи shredcycles 3 # Отложить сжатие последнего лога delaycompress # Выполнять postrotate только один раз sharedscripts # После ротации послать программе сигнал SIGHUP, в результате чего # будут переоткрыты дескрипторы логов # (многие программы поддерживают такое поведение) postrotate kill -SIGHUP $(cat /var/run/mydaemon.pid) endscript }

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