Введение:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Logrotate - это системная утилита, которая управляет автоматической ротацией и сжатием лог-файлов. Если в процессе длительной работы сервера файлы не были ротированы, сжаты и периодически не удалялись, то рано или поздно они могут занять весь доступный объем памяти. Logrotate устанавливается по умолчанию на сервере и настроена для обработки ротации журналов для всех установленных пакетов и приложений. Основной файл конфигурации — /etc/logrotate.conf. Для создания настроек отдельных логов — используем директорию /etc/logrotate.d адрес_файла_лога { директивы } |
Основные директивы управления и обработки логов:
1 2 3 4 5 6 7 8 9 10 |
Опции, определяющие интервал ротации: !!! Порядок выполнения : hourly,daily, weekly, monthly, ИЛИ size hourly - каждый час (cron для logrotate должен быть) daily - каждый день (по умолчанию) weekly - ротация раз в неделю monthly - ротация раз в месяц yearly - ротация раз в год size - размер лога, когда он будет достигнут будет перемещен, возможные варианты size 500M |
Дополнительные директивы, опции сжатия логов:
1 2 3 4 5 6 7 8 |
compress - Сжимать логи при ротации. По умолчанию для сжатия используется gzip compresscmd - Команда/программа, которая будет использоваться для сжатия логов compressoptions - Опции команды ротации, которые будут использоваться при сжатии логов uncompresscmd - Команда разархивации логов. По умолчанию gunzip compressext - Указать расширение файлов, которое будет указываться для сжатых логов delaycompress - Отложить сжатие лога до следующей ротации. Таким образом последняя версия лога после ротации будет несжатой, а более ранние — сжатыми nocompress - Не сжимать логи при ротации nodelaycompress - Не откладывать сжатие до следующей итерации ротации. Эта опция перегружает опцию delaycompress |
Дополнительные директивы, опции копирования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
copy - Копировать лог-файл, но не изменять оригинал. Эту опцию можно использовать, когда надо создать снимок лога на определенный момент, вместо ротации, либо когда для усечения лога используется внешняя программа. Если используется опция copy, то опция create, если она указана, не будет иметь никакого эффекта, так как старый лог остается. copytruncate - Урезать оригинальный файл до нулевого размера после создания копии вместо переименования оригинального файла и создания нового. Эта опция используется тогда, когда программе, записывающей лог, нельзя указать, что нужно закрыть связанный с файлом лога дескриптор и открыть новый. Такая программа может продолжать писать в старый файл. При использовании этой опции есть один момент, связанный с тем, что на копирование требуется некоторое время и поэтому файл не может быть скопирован мгновенно. За время копирования в лог могут быть добавлены записи, которые будут утеряны при усечении файла до нулевого размера. При использовании этой опции опция create также не будет иметь эффекта, так как старый файл остается на месте nocopy - Не копировать оригинальный лог-файл. Эта опция перегружает опцию copy nocopytruncate - Не усекать оригинальный лог-файл после создания копии. Эта опция перегружает опцию copytruncate |
Дополнительные директивы, опции создания нового лог-файла (после ротации старого):
1 2 3 4 5 6 7 8 9 10 |
create права владелец группа create владелец группа - Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла nocreate - Новые лог-файлы не создаются. Эта опция перегружает опцию create |
Дополнительные директивы, опции, связанные с удалением файла лога:
1 2 3 4 5 6 7 8 9 10 |
shred - Удалять лог-файл при помощи программы команды «shred -u». По умолчанию используется unlink shredcycles количество - Указать количество циклов перезаписи содержимого файла до его удаления. Если опция не указана, будет использовано значение по умолчанию noshred - Не использовать shred для удаления maxage количество - Удалять файлы логов, которые старше, чем указанное количество дней. Возраст файлов проверяется только когда происходит ротация. Файлы высылаются по электронной почте на сконфигурированный адрес, если указаны опции mail и maillast |
Дополнительные директивы, опции, связанные с датами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 - Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива |
Дополнительные директивы, опции, связанные с рассылкой логов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 - Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию. |
Дополнительные директивы, опции , связанные с директориями, в которых хранятся логи:
1 2 3 4 5 6 7 8 |
olddir директория - Директория, в которую будут перемещаться логи при ротации. Эта директория должна находиться на том же устройстве, что и ротируемый файл лога. Путь к директории можно указывать как абсолютный, так и без полного пути. Во втором случае он будет считаться поддиректорией директории, в которой хранится оригинальный файл лога. Когда эта опция указана, все старые версии логов попадают в эту директорию. Опция может быть перегружена опцией noolddir noolddir - Логи ротируются в той же директории, где находится оригинальный фай |
Дополнительные директивы, опции выполнения скриптов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет. |
Дополнительные директивы, общего назначения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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-* |
Часто используемые:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
notifempty - не ротировать пустой лог-файл rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество dateext - добавляет дату ротации перед заголовком старого лога compress - указывает, что лог необходимо сжимать delaycompress - не сжимать последний и предпоследний журнал extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение mail - отправлять Email после завершения ротации maxage - выполнять ротацию журналов, если они старше, чем указано missingok - не выдавать ошибки, если лог файла не существует olddir - перемещать старые логи в отдельную папку start - номер, с которого будет начата нумерация старых логов nocopytruncate - не сбрасывать файл журнала после копирования copytruncate - сбрасывать файл журнала после копирования create - указывает, что необходимо создать пустой лог файл после перемещения старого create 640 root – с какими правами и владельцем будет создан новый файл nocreate - не создавать пустой журнал postrotate/endscript - выполнить произвольные команды после ротации, между postrotate и endscript расположены команды интерпретатора sh(1) исполняемые непосредственно после ротации |
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
!!! Примеры: /etc/logrotate.d Пример 000: /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 } Пример 0: /var/log/runtel/cdr.log /var/log/runtel/core.log /var/log/runtel/event-hunter.log /var/log/runtel/iface.log { daily size 10M missingok copytruncate create 0640 root adm rotate 30 compress } Пример 1: /var/log/messages { size 10M rotate 3 compress delaycompress } Пример 2: /var/log/messages1 { daily size 10M rotate 3 compress delaycompress } Пример 3: /var/log/testing/logrotate.conf /var/log/testing/logs/*.log { hourly missingok rotate 24 compress create } Пример 4: /var/log/asterisk/debug /var/log/asterisk/console /var/log/asterisk/security /var/log/asterisk/messages /var/log/asterisk/full /var/log/asterisk/*_log /var/log/asterisk/cdr-csv/Master.csv { daily dateext dateformat -%Y%m%d.log missingok notifempty rotate 63 compress delaycompress sharedscripts postrotate /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null endscript } Пример 5: /var/log/audit/audit.log { compress dateext rotate 15 daily missingok notifempty create 600 root root sharedscripts postrotate /sbin/service auditd restart 2> /dev/null > /dev/null || true endscript } Пример 6: /var/log/postgresql/*.log { daily rotate 7 copytruncate compress delaycompress notifempty missingok su root root } Пример 7: /var/log/php-fpm/*.log { rotate 14 missingok notifempty sharedscripts compress maxage 14 postrotate /bin/kill -SIGUSR1 `cat /var/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true endscript } Пример 8: /var/log/logstash-forwarder/*.log { rotate 30 size=10M missingok notifempty compress maxage 30 postrotate (/usr/bin/systemctl restart logstash-forwarder || /sbin/service logstash-forwarder restart) > /dev/null 2>&1 endscript } /var/log/logstash-forwarder/*.err { rotate 30 size=10M missingok notifempty compress maxage 30 postrotate (/usr/bin/systemctl restart logstash-forwarder || /sbin/service logstash-forwarder restart) > /dev/null 2>&1 endscript } Пример 9: /var/log/dhcp.log { daily rotate 10 missingok notifempty compress delaycompress sharedscripts create 0600 root root postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } Пример 10: /var/log/openvpn/openvpn*.log { daily rotate 7 compress copytruncate delaycompress missingok notifempty } |
Команды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
man logrotate - помощь С ключом -d программа будет только эмулировать полезную активность, выводя вам на экран диагностические сообщения (реально она логи не тронет). Теперь давайте протестируем, удачно ли создан конфиг: logrotate -d /etc/logrotate.d/example logrotate -d /etc/logrotate.d/example-app - выполнить проверку example-app logrotate -d /etc/logrotate.d/rsyslog.conf - выполнить проверку rsyslog.conf logrotate /etc/logrotate.conf --debug - можно выполнить тестирование конфигурации Если всё в порядке, то запускайте утилиту в боевом режиме: logrotate -v -f /etc/logrotate.d/example Если вы хотите заставить LogRotate производить ротацию файла журнала, тогда надо использовать флаг –force: logrotate /home/testing/logrotate.conf --state /home/testing/logrotate-state --verbose --force cat /var/lib/logrotate/status - информация о том, что и когда ротировал logrotate Подстройка расписания под себя: /etc/cron.d/logrotate_apache2 ------------ 0/30 * * * * root /usr/sbin/logrotate /etc/logrotate.d/apache2 ------------ |