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 достаточно много опций, но их можно разбить на несколько групп. Вот опции, которые могут быть использованы в конфигурационных файлах:
Опции, определяющие интервал ротации:
hourly daily weekly monthly yearly |
Ротировать файл лога каждый час, каждый день, каждую неделю, каждый месяц, каждый год. Запуск ротации обеспечивается обычно при помощи ежедневного запуска cron (файл /etc/cron.daily/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 |
Опции, связанные с удалением файла лога:
shred | Удалять лог-файл при помощи программы команды «shred -u». По умолчанию используется unlink |
shredcycles количество | Указать количество циклов перезаписи содержимого файла до его удаления. Если опция не указана, будет использовано значение по умолчанию |
noshred | Не использовать shred для удаления |
maxage количество | Удалять файлы логов, которые старше, чем указанное количество дней. Возраст файлов проверяется только когда происходит ротация. Файлы высылаются по электронной почте на сконфигурированный адрес, если указаны опции mail и maillast |
Опции, связанные с датами:
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 | Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива |
Опции, связанные с рассылкой логов:
mail адрес | Указать адрес, на который будет выслан старый лог после ротации |
nomail | Не отправлять старые логи по электронной почте. |
mailfirst | Отправлять самый свежий файл после ротации |
maillast | Отправлять самый старый файл после ротации. Этот вариант используется по умолчанию |
Опции, связанные с размером и существованием файла лога:
maxsize размер | Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла. |
minsize размер | Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly) |
size размер | Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M — в мегабайтах, если G — в гигабайтах. Например, 1G или 10M. |
ifempty | Ротировать файл лога, даже если он пуст. Используется по умолчанию. |
notifempty | Не ротировать файл лога, если он пуст. Перегружает опцию ifempty. |
missingok | Если файл лога отсутствует, перейти к следующему без сообщения об ошибке |
nomissingok | Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию. |
Опции, связанные с директориями, в которых хранятся логи:
olddir директория | Директория, в которую будут перемещаться логи при ротации. Эта директория должна находиться на том же устройстве, что и ротируемый файл лога. Путь к директории можно указывать как абсолютный, так и без полного пути. Во втором случае он будет считаться поддиректорией директории, в которой хранится оригинальный файл лога. Когда эта опция указана, все старые версии логов попадают в эту директорию. Опция может быть перегружена опцией noolddir |
noolddir | Логи ротируются в той же директории, где находится оригинальный файл |
Файлы настроек для 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 или пользовались, но никогда не настраивали тонко под себя, надеюсь эта информация вам поможет.
Спасибо большое за статью, не подскажите как разгроничить или убрать логирование для определённой группы пользователей……?
Можно пример, а то я не очень понял, о чем речь?
есть две группы пользователей
acl first src 0.0.0.0 — c опеределлённым ip
acl second src 1.1.1.1 — что б, эта группа не логировалась….
а логи велись только для первой группы…..
Выглядит как часть конфига squid’а.
Для него можно указать как-то так:
acl first src 0.0.0.0
acl second src 1.1.1.1
access_log none second
access_log /var/log/squid/access.log common first
Можно одну из двух строчек с access_log оставить.
Но к ротации логов это отношения не имеет.
Спасибо большое за ответ!!! очень признателен…!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Добрый день, и с НГ!
Вот вы пишите про ротацию логов, а по факту вы их ни как не фильтруете в примерах.
Допустим у нас есть логи с nginx по 10 сообщ/с
Из этого огромного «флуда» информации нужно вкл ротацию — хранить логи только с ошибками, а остальные удалять.
У вас же «ротация» заключается лишь в том, чтобы задать вид сбора логово и их архивирование(хранение). Т.е. собрать логи за неделю и заархивировать, и снова продолжить собирать.
Поясните может быть я не прав? Можно реализовать ротацию как в моем примере?
Добрый день. И вас с Новым Годом.
Сбор логов с архивацией более поздних и есть ротация. Само понятие ротации — это замена чего-то на следующее что-то. В контексте логов — замена файла, в котором уже есть данные, на пустой файл, в который логи будут писаться дальше.
То, что вы описали, если я правильно понял задачу, реализуется отключением access-логов в конфиге nginx’а.
Но более правильно будет поднять отдельный сервер с rsyslog’ом и включить в конфигах nginx’а передачу логов этому серверу. Это позволит в том числе хранить логи в одном месте и централизованно их анализировать, если нужна информация по трафику с нескольких серверов. Анализ также требует вычислительных мощностей, и это не будет аффектить работу веб-серверов.
Возможно я не правильно выразился. Давайте обрисую всю картинку, чтобы было понятно куда копать.
У нас реализован централизованный сервер сбора логов GrayLog+Elasticshearch.
Я на него получаю логи со всего, что движется в моей сети ( все сетевые устройства, от серверов, до датчика температуры или ИБП)
Это достаточно больше кол-во хранимой информации.
Задача настроить ротацию логов (как это представляет руководитель)
Получать логи только избранные( например — кто авторизовался) и хранить их на сервере GrayLog 12 мес. А все остальные логи( включая и отфильтрованные) хранить 3 мес.
Задача у вас скорее настроить фильтрацию логов в первую очередь, с чем отлично справляется rsyslog. Он позволяет их фильтровать по разным признакам и в зависимости от этого либо записывать в отдельные лог-файлы, либо отправлять на удаленный сервер. И потом уже ротировать сами полученные логи на сервере GrayLog.
извините, как настроить ротацию логов ? где найти и открыть файл /etc/logrotate.conf ? у меня панель vesta
Зайти по SSH на сервер. Для этого скачать программу PuTTY. После входа по SSH на сервер использовать текстовый редактор, nano, например.
спасибо, просто у меня на сервере каждый день забивается примерно 10-20 мб в сутки.
Вот данные root, ротация идет? логи очищены?
———————————————-
[root@server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 9.9G 9.1G 311M 97% /
tmpfs 248M 0 248M 0% /dev/shm
[root@server ~]#
—————————————
[root@server ~]# du -sh /*
8.0K /aquota.group
8.0K /aquota.user
0 /backup
4.0K /base
6.9M /bin
22M /boot
164K /dev
8.2M /etc
7.8G /home
76M /lib
19M /lib64
16K /lost+found
4.0K /media
4.0K /mnt
4.0K /opt
du: cannot access `/proc/25020/task/25020/fd/4′: No such file or directory
du: cannot access `/proc/25020/task/25020/fdinfo/4′: No such file or directory
du: cannot access `/proc/25020/fd/3′: No such file or directory
du: cannot access `/proc/25020/fdinfo/3′: No such file or directory
0 /proc
140K /root
8.5M /sbin
4.0K /selinux
4.0K /srv
0 /sys
500K /tmp
1.1G /usr
145M /var
[root@server ~]#
——————————————
К сожалению, по этим данным нельзя ответить на эти вопросы.
Можете прислать вывод команды ls -l /var/log ?
После ротации, получаю файл logfile.log и ligfile.log.1 вроде всё как задумано. Но, некоторые демоны продолжают писать во второй файл, при этом первый остаётся пустым. Пока попробовал в postrotate записать systemctl kill -s SIGHUP service-name.service. Помогло, не знаю насколько это корректно. Как тоже самое сделать для python программы? Сами unit файлы я написал, а вот с логом такая неприятность.
Да, это вполне нормально посылать SIGHUP при ротации.
Для Python-программы можно воспользоваться https://docs.python.org/3.5/library/syslog.html
Это позволит не писать файл лога напрямую, и тогда не надо будет ничего делать с самой программой.
Добрый день. Спасибо за статью.
Подскажите как можно запускать ротацию определенных логов в определенное время.. Например мне нужно что-бы ротация для логов squid-а (и только) проходила в 3:00 каждый день не зависимо от их размера.