Статья является переводом текста Майкла Лукаса (Michael Lucas), опубликованного по адресу http://www.onlamp.com/pub/a/bsd/2001/06/14/Big_Scary_Daemons.html.
Файлы журналов растут. Собственно говоря для этого они и предназначены. Как системный администратор, вы должны иметь способ контролировать их рост. Для этого FreeBSD имеет стандартное средство -- newsyslog. Newsyslog позволяет вам осуществлять ротацию файлов журналов. Самые старые файлы удаляются, устаревшие последовательно переименовываются и, наконец, текущий лог замещается заново созданным. Утилита newsyslog может сжимать файлы журналов, перезапускать демонов и осуществлять всю необходимую поддержку выполнения рутинных операций по перетасовке файлов. По умолчанию система настроена на запуск newsyslog один раз в час, это делается при помощи демона cron. Newsyslog читает конфигурационный файл /etc/newsyslog.conf и проверяет каждый указанный там файл журнала. При совпадении указанного условия производится ротация соответствующего журнала. В файле /etc/newsyslog.conf каждая строка содержит конфигурацию ротации для одного файла журнала. В начале каждой строки указывается полное имя файла журнала, например /var/log/httpd-error.log. Далее идет необязательное поле, которое, кстати не используется в поставляемом вместе с системой newsyslog.conf, это список из владельца и группы файла, разделенных двоеточием. Вот так: «root:wheel». Newsyslog может изменять владельца и группу и старых файлов журналов. По умолчанию владельцем устаревших журналов является пользователь root, группы wheel. Эту возможность вы можете с успехом применять на многопользовательских машинах. Вы можете указать изменение только владельца, или только группы. В этом случае вы должны будете использовать двоеточие с пустым местом там, где должен находиться неизменяемый параметр. Например «:www» сменит группу на «www», а «user827:» заменит владельца на «user827». Третье поле содержит режим доступа к устаревшим файлам журналов в стандартном трехциферном Unix-формате. Далее идет счетчик, указывающий newsyslog на количество хранимых устаревших журналов. Newsyslog начинает отсчет файлов с нуля. В то время как большинство программ начинают считать с нуля, newsyslog включает 0 «по умолчанию» и считает файлы не учитывая нулевой. По умолчанию для журнала /var/log/massages счетчик равен пяти, при этом /var/log содержит следующие файлы:
messages messages.0.gz messages.1.gz messages.2.gz messages.3.gz messages.4.gz messages.5.gz
Те из вас, кто может сосчитать количество файлов, видят, что их шесть, а не пять, плюс еще и текущий файл журнала. Как правило, иметь большее количество журналов лучше, чем испытывать в них недостаток. В то же время, если вы испытываете недостаток свободного пространства на винчестере, то иногда вы будете испытывать искушение удалить один-два излишних журнала. Похожая ситуация возникает на некоторых веб-серверах, на которых размещены до нескольких сотен сайтов -- несколько удаленных журналов каждого сайта в сумме могут составить достаточно большой объем свободного места. Следующие два поля конфигурационной записи указывают newsyslog размер и время при наступлении которых указанный файл необходимо подвергнуть ротации. Можно осуществлять ротацию по достижении определенного объема файла, или при наступлении определенного времени, или в обоих случаях. Если указаны оба условия, то ротация будет происходить при выполнении любого из них. Если размер или время не важны, например, если вы хотите проводить ротацию строго один раз в день, независимо от размера файла, то вместо указания размера необходимо поставить звездочку «*». Пятое поле используется для указания размера в килобайтах. Когда newsyslog запускается он сравнивает размер файла с указанным, если файл больше, то производится его ротация. Пока все просто, правда? Шестое поле, указывающее время, заставляет плакать новичков в системном администрировании. Поле времени может содержать данные четырех типов: «звездочку», число или два различных формата даты. Если вы не хотите производить ротацию журналов в определенное время, просто поставьте в это поле «звездочку». Если в поле будет число, то newsyslog будет проводить ротацию по прошествии указанного количества часов. Например, если вы хотите, что бы ротация проводилась каждые 24 часа, и вам не важно в какое именно время, то просто поставьте в это поле число «24». Если поле начинается символом «@», то считается что время представлено в формате ISO-8601, этот стандарт используется newsyslog в большинстве Unix-подобных операционных систем. Этот формат использовался первой версией newsyslog разработанной в MIT (Массачусетский Технологический Институт -- прим. переводчика). На первый взгляд этот формат не совсем понятен. Но, поскольку это стандарт, FreeBSD его поддерживает. Полная запись даты в формате ISO-8601 состоит из 16 цифр с буквой «T» в середине. Первые четыре цифры означают год, следующие две -- месяц, и еще две -- день месяца. Буква «T» идет после даты, отделяя ее от времени, как десятичная точка в вещественных числах отделяет дробную часть от целой. После буквы «T» идут две цифры часа, затем две цифры минут и наконец две цифры секунд. Например дата 2 февраля 2002 года, 21:15:08, в формате ISO-8601будет выглядеть следующим образом:
20020202T211508
Вы обязательно должны ставить букву «T» в ISO-8601-дате. Указание полных дат в формате ISO-8601 просто и очевидно. Путаница начинается, когда вы не пишете полную дату. Вы можете указать поля даты только рядом с буквой «T», оставив остальное место незаполненным. Все неуказанные поля не будут учитываться при сравнении. Например T23 значит -- любой день в году, 23:00. Если вы напишете в newsyslog.conf @T23, то ротация этого журнала будет проводиться каждый день, ровно в 23:00. Запись 4T00 значит полночь 4 числа каждого месяца, таким образом @4T00 будет запускать ротацию в это время. Так же как при работе с crontab вам следует уточнить часы ротации. Указание даты типа @7T будет запускать ротацию один раз в час, каждый час седьмого числа каждого месяца. Таким образом такая дата будет запускать ротацию раз в час на протяжении целого дня. Это может быть полезно для отладки, но вряд ли пригодится в реальной жизни. Эта система имеет одну серьезную проблему -- она не дает простого способа задавать ежедневно выполняемые задачи. Желание запустить ротацию журнала по понедельникам, не является чем-то необычным. Запустить ротацию журнала в последний день месяца таким образов вообще не удастся. Тут на помощь приходит второй формат времени. Если запись времени начинается со знака доллара «$», то считается, что время задается в специфическом FreeBSD-формате «месяц-неделя-день». Это очень похоже на cron и позволяет вам установить конкретные дни недели для выполнения задачи. Этот формат использует три буквенных идентификатора: M (день месяца), W (день недели), H (час дня). После каждого из них идет число, указывающее точное время запуска. Часы находятся в интервале от 0 до 23, дни недели от 0 (воскресенье), до 6 (суббота). Дни месяца: от 1 и до количества дней в конкретном месяце. Например для запуска ротации каждое воскресение в 8 утра вам следует задать время как $W0H8. Если вы захотите ротировать журналы в полдень 5 числа каждого месяца, то напишите $M5H12. Одна интересная функция этой системы позволяет вам автоматически задавать ротацию на последний день месяца используя специальный «день месяца» -- «L» (от last -- последний. Прим. переводчика). Без этого знака было бы очень трудно задать ротацию журнала в последний день месяца без написания скрипта, который бы вставлял количество дней в конкретном месяце. Если вы хотите запустить ротацию вашего журнала аккаунтов за два часа до начала нового месяца, вы должны использовать запись $MLH22. После того, как вам удалось точно указать время ротации, перейдем к полю флагов. Это поле необязательно для большинства журналов, однако для некоторых оно жизненно важно. Newsyslog вставляет сообщение «logfile turned over» в каждый вновь созданный файл журнала. Если журнал ведется в двоичном виде (как например /var/log/wtmp), то добавление такого сообщения обязательно его испортит. Флаг «B» запрещает newsyslog’у вставлять это сообщение. Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг «Z» укажет newsyslog, что старые журналы следует сжать gzip’ом. Одновременно допускается использовать только один из этих флагов. Следующее поле задает путь к «pid-файлу» процесса пишущего журнал. Использование pid-файлов является простым способом записи поля ID процесса в системе, так что бы другие программы могли его легко прочитать. Большинство программ хранят свои pid-файлы в каталоге /var/run -- поглядите них у себя на машине. Если в этом поле вы укажете полный путь к pid-файлу, то newsyslog будет посылать сигнал этому процессу когда будет производиться ротация. Например веб-сервер Apache должен быть оповещен при ротации его журналов. Записав в этом поле полный путь к его pid-файлу вы заставите newsyslog посылать процессу Apache сигнал kill -1, что бы он запустил свою часть обработки ротации журналов. Большинство программ поддерживают ротацию журналов сигналом kill -1 или SIGHUP. Некоторые программы требуют специального сигнала, когда их файлы ротируют. Если вы используйте программу такого типа, то укажите номер необходимого сигнала в последнем поле. Давайте соберем все сказанное вместе, в самом худшем случае, в примере, в который трудно поверить. Итак у вас есть журнал базы данных, который вы хотите ротировать в 23 часа в последний день каждого месяца. В документации базы данных сказано, что вы должны послать процессу базы сигнал прерывания (SIGINT или сигнал номер 2) после ротации. Вы хотите, что бы архивные журналы принадлежали пользователю «dbadmin» и читать их мог только он. Более того, журналы -- двоичные файлы и должны быть не тронуты newsyslog’ом. Ваш newsyslog.conf должен выглядеть следующим образом:
/var/log/database dbadmin: 600 30 * $MLH23 B /var/run/db.pid 2
Это крайний случай, в большинстве реальных ситуаций вам следует только собрать имя файла и условие ротации. Всего-то. Комментарии: 0 Отправить другу |