Главная > Программы Ротация журналов 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'у вставлять это сообщение. Большинство журналов ведется в текстовом
формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг
Одновременно допускается использовать только один из этих флагов. Следующее поле задает путь к <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 Это крайний случай, в большинстве реальных ситуаций вам следует только собрать имя файла и условие ротации. Всего-то. Материал взят с сайта: https://muff.kiev.ua/content/newsyslog-rotatsiya-logovРотацией логов во FreeBSD занимаетсяNewsyslog обычно запускается по cron’у раз в час, читает конфигурационный файл /etc/newsyslog.conf и определяет, когда лог-файлы нуждаются в архивировании и перегруппировке. logfile перемещается в logfile.0, logfile.0 перемещается в logfile.1, и так далее. Другое именование получится при архивировании с помощью gzip: logfile.0.gz, logfile.1.gz, и т.д. Конфигурационный файл newsyslog.conf указывает, какие лог-файлы должны быть проинспектированы, сколько их должно быть сохранено, а также, когда они должны быть пересмотрены. Лог-файлы могут быть перегруппированы и/или заархивированы исходя из заданных параметров:
Для примера, "кусочек" newsyslog.conf на одном из серверов:
Описание:
Предлагаю рассмотреть более подробно синтаксис конфигурационного файла. 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 Те из вас, кто может сосчитать количество файлов, видят, что их шесть, а не пять, плюс еще и текущий файл журнала. Как правило, иметь большее количество журналов лучше, чем испытывать в них недостаток. В то же время, если присутствует недостаток свободного пространства на винчестере, то иногда вы будете испытывать искушение удалить один-два излишних журнала. Похожая ситуация возникает в основном на веб-серверах, где размещено до нескольких сотен сайтов – несколько удаленных журналов каждого сайта в сумме могут составить достаточно большой объем свободного места. 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Использован материал: https://unix.uz/articles/system/143-rotaciya-logov-newsyslog.html Главная > Программы |