Главная | Контакты



Главная > Программы

Ротация журналов NEWSYSLOG


Автор: Станислав Лапшанский, slapsh@kos-obl.kmtn.ru

Статья является переводом текста Майкла Лукаса (Michael Lucas).

Файлы журналов растут. Собственно говоря для этого они и предназначены. Как системный администратор, вы должны иметь способ контролировать их рост. Для этого 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'у вставлять это сообщение.

Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг укажет 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

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

Материал взят с сайта: http://unixdoc.ua-i.net/articles/freebsd/install%27n%27setup/www.sergeyka.h10.ru/newsyslog.html

Ротацией логов во FreeBSD занимается newsyslog.

Newsyslog обычно запускается по cron’у раз в час, читает конфигурационный файл /etc/newsyslog.conf и определяет, когда лог-файлы нуждаются в архивировании и перегруппировке. logfile перемещается в logfile.0, logfile.0 перемещается в logfile.1, и так далее. Другое именование получится при архивировании с помощью gzip: logfile.0.gz, logfile.1.gz, и т.д.

Конфигурационный файл newsyslog.conf указывает, какие лог-файлы должны быть проинспектированы, сколько их должно быть сохранено, а также, когда они должны быть пересмотрены. Лог-файлы могут быть перегруппированы и/или заархивированы исходя из заданных параметров:

  • когда они достигнут определённого размера;
  • при достижении определённых даты/времени.

Для примера, "кусочек" newsyslog.conf на одном из серверов:

# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  *     JC
/var/log/console.log                    600  5     100  *     J
/var/log/cron                           600  3     100  *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     100  *     JC
/var/log/kerberos.log                   600  7     100  *     J
/var/log/lpd-errs                       644  7     100  *     JC
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     100  *     JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/pflog                          600  3     100  *     JB    /var/run/pflogd.pid
/var/log/ppp.log        root:network    640  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/xferlog                        600  7     100  *     JC

 Описание:

  • лог-файл – абсолютный путь к лог-файлу;
  • [владелец:группа] - необязательный параметр, который указывает newsyslog’у кто должен являться владельцом данного лог-файла ;
  • права - права, которые необходимо выставить на файл;
  • количество - максимальное количество заархивированных лог-файлов;
  • размер - по достижению какого размера архивировать лог-файл;
  • когда - время, через которое архивировать лог-файл;
  • флаги — некоторые дополнитпараметры, для лог-файлов:
    • B - по умолчанию, newsyslog добавляет в новый лог-файл сообщение о том, что лог-файл был ротирован, но если лог-файл бинарный, то это сообщение испортит лог, с параметром B newsyslog не будет добавлятьт никаких сообщений в лог
    • C - если лог-файл не существует, то его необходимо создать.
    • G - если указан данный флаг, то в названии лог-файла можно использовать стандартные шаблоны(например *)
    • J - сжимать лог-файл, используя bzip2
    • N - Не предупреждать никакой процесс, о ротации лог-файла
    • W - если используете флаги Z или J, то newsyslog должен подождать, пока заверщиться процесс архивации.
    • Z - сжимать лог, использую gzip.

Предлагаю рассмотреть более подробно синтаксис конфигурационного файла.

logfilename - указывается полное имя файла журнала, например /var/log/httpd-error.log.

[owner:group] - как уже писалось - необязательная опция. Это список из владельца и группы файла, разделенных двоеточием. Вот так: "root:wheel". Newsyslog может изменять владельца и группу также и старых файлов журналов. По умолчанию владельцем устаревших журналов является пользователь root, группы wheel. Эту возможность вы можете с успехом применять на многопользовательских машинах. Также есть возможность указать изменение только владельца, или только группы. В этом случае необходимо использовать двоеточие с пустым местом там, где должен находиться неизменяемый параметр. Например ":www" сменит группу на "www", а "username:" заменит владельца на "username".

mode - здесь проблем не должно быть. Указываем режим доступа к устаревшим файлам журналов в стандартном трехциферном Unix-формате.

count - счетчик, указывающий 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

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

size  и when - поля конфигурационной записи указывают newsyslog размер и/или  время, при наступлении которых указанный файл необходимо подвергнуть ротации. Можно осуществлять ротацию по достижении определенного объема файла, или при наступлении определенного времени, или в обоих случаях. Если указаны оба условия, то ротация будет происходить при выполнении любого из них.

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

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

Поле when, указывающее время, заставляет плакать новичков в системном администрировании. Поле времени может содержать данные четырех типов: «звездочку», число или два различных формата даты.

Если вы не хотите производить ротацию журналов в определенное время, просто поставьте в это поле «звездочку».

Если в поле будет число, то 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.

flags - это поле необязательно для большинства журналов, однако для некоторых оно жизненно важно.

Newsyslog вставляет сообщение «logfile turned over» в каждый вновь созданный файл журнала. Если журнал ведется в двоичном виде (как например /var/log/wtmp), то добавление такого сообщения обязательно его испортит. Флаг «B» запрещает newsyslog'у вставлять это сообщение.

Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг «Z» укажет newsyslog, что старые журналы следует сжать gzip'ом.

Одновременно допускается использовать только один из этих флагов.

[/pid_file] - задает путь к «pid-файлу» процесса пишущего журнал. Использование pid-файлов является простым способом записи поля ID процесса в системе, так что бы другие программы могли его легко прочитать. Большинство программ хранят свои pid-файлы в каталоге /var/run – поглядите них у себя на машине. Если в этом поле вы укажете полный путь к pid-файлу, то newsyslog будет посылать сигнал этому процессу когда будет производиться ротация. Например веб-сервер Apache должен быть оповещен при ротации его журналов. Записав в этом поле полный путь к его pid-файлу вы заставите newsyslog посылать процессу Apache сигнал kill -1, что бы он запустил свою часть обработки ротации журналов.

[sig_num]  - большинство программ поддерживают ротацию журналов сигналом kill -1 или SIGHUP. Некоторые программы требуют специального сигнала, когда их файлы ротируют. Если вы используйте программу такого типа, то укажите номер необходимого сигнала в последнем поле.

Давайте соберем все сказанное вместе, в самом худшем случае, в примере, в который трудно поверить. Итак у вас есть журнал базы данных, который вы хотите ротировать в 23 часа в последний день каждого месяца. В документации базы данных сказано, что вы должны послать процессу базы сигнал прерывания (SIGINT или сигнал номер 2) после ротации. Вы хотите, что бы архивные журналы принадлежали пользователю "dbmanager" и читать их мог только он. Более того, журналы – двоичные файлы и должны быть не тронуты newsyslog'ом. Ваш newsyslog.conf должен выглядеть следующим образом:

/var/log/database dbmanager: 600 30 * $MLH23 B /var/run/db.pid 2 

Использован материал: http://muff.kiev.ua/content/newsyslog-rotatsiya-logov
Главная > Программы