Newsyslog - ротация логов

  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:c35a3adcf1d4a4416a5718d1093fa42f' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtejustify\">Вот на днях заметил лог-файл &quot;дивного&quot; обьема - 19,5 ГБ (сервер достался от предыдущего одмина, соответственно много чего интересного замечаю <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/teeth_smile.gif\" />&nbsp;). Решил проинспектировать и нормально настроить ротацию логов. Ротацией логов во FreeBSD занимается <a href=\"http://www.freebsd.org/cgi/man.cgi?query=newsyslog&amp;sektion=8\">newsyslog</a>.</p>\n<p class=\"rtejustify\">Newsyslog обычно запускается по cron&rsquo;у раз в час, читает конфигурационный файл /etc/newsyslog.conf и определяет, когда лог-файлы нуждаются в архивировании и перегруппировке. logfile перемещается в logfile.0, logfile.0 перемещается в logfile.1, и так далее. Другое именование получится при архивировании с помощью <a href=\"http://www.freebsd.org/cgi/man.cgi?query=gzip&amp;sektion=1\"><span style=\"color: #3366ff\">gzip</span></a>: logfile.0.gz, logfile.1.gz, и т.д.</p>\n<p class=\"rtejustify\">Конфигурационный файл newsyslog.conf указывает, какие лог-файлы должны быть проинспектированы, сколько их должно быть сохранено,&nbsp;а также,&nbsp;когда они должны быть пересмотрены. Лог-файлы могут быть перегруппированы и/или заархивированы&nbsp;исходя&nbsp;из&nbsp;заданных параметров:</p>\n<ul>\n<li class=\"rtejustify\">когда они достигнут определённого размера;</li>\n<li class=\"rtejustify\">при достижении определённых даты/времени.</li>\n</ul>\n<p class=\"rtejustify\">Для примера, &quot;кусочек&quot; newsyslog.conf на одном из серверов:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<pre>\n# logfilename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [owner:group]&nbsp;&nbsp;&nbsp; mode count size when&nbsp; flags [/pid_file] [sig_num]<br />/var/log/all.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; @T00&nbsp; J<br />/var/log/amd.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 644&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; J<br />/var/log/auth.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/console.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; J<br />/var/log/cron&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/daily.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; @T00&nbsp; JN<br />/var/log/debug.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/kerberos.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; J<br />/var/log/lpd-errs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 644&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/maillog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; @T00&nbsp; JC<br />/var/log/messages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 644&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/monthly.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp; 12&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; $M1D0 JN<br />/var/log/pflog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JB&nbsp;&nbsp;&nbsp; /var/run/pflogd.pid<br />/var/log/ppp.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root:network&nbsp;&nbsp;&nbsp; 640&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/security&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 10&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC<br />/var/log/sendmail.st&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp; 10&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; 168&nbsp;&nbsp; B<br />/var/log/weekly.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; $W6D0 JN<br />/var/log/wtmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 644&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; @01T05 B<br />/var/log/xferlog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 600&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; JC</pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">&nbsp;Описание:</p>\n<ul>\n<li class=\"rtejustify\"><strong>лог-файл </strong>&ndash; абсолютный путь к лог-файлу;</li>\n<li class=\"rtejustify\"><strong>[владелец:группа]</strong> - необязательный параметр, который указывает newsyslog&rsquo;у кто должен являться владельцом данного лог-файла ;</li>\n<li class=\"rtejustify\"><strong>права</strong> - права, которые&nbsp;необходимо выставить на файл;</li>\n<li class=\"rtejustify\"><strong>количество</strong> - максимальное количество заархивированных лог-файлов;</li>\n<li class=\"rtejustify\"><strong>размер</strong> - по достижению какого размера архивировать лог-файл;</li>\n<li class=\"rtejustify\"><strong>когда</strong> - время, через которое архивировать лог-файл;</li>\n<li class=\"rtejustify\"><strong>флаги</strong> &mdash; некоторые дополнитпараметры, для лог-файлов:\n<ul>\n<li class=\"rtejustify\"><strong>B</strong> - по умолчанию, newsyslog добавляет в новый лог-файл сообщение о том, что лог-файл был ротирован, но если лог-файл бинарный, то это сообщение испортит лог, с параметром B newsyslog не будет добавлятьт никаких сообщений в лог</li>\n<li class=\"rtejustify\"><strong>C</strong> - если лог-файл не существует, то его необходимо создать.</li>\n<li class=\"rtejustify\"><strong>G</strong> - если указан данный флаг, то в названии лог-файла можно использовать стандартные шаблоны(например *)</li>\n<li class=\"rtejustify\"><strong>J</strong> - сжимать лог-файл, используя bzip2</li>\n<li class=\"rtejustify\"><strong>N</strong> - Не предупреждать никакой процесс, о ротации лог-файла</li>\n<li class=\"rtejustify\"><strong>W</strong> - если используете флаги Z или J, то newsyslog должен подождать, пока заверщиться процесс архивации.</li>\n<li class=\"rtejustify\"><strong>Z</strong> - сжимать лог, использую gzip.</li>\n</ul>\n</li>\n</ul>\n<p class=\"rtejustify\">Предлагаю рассмотреть более подробно&nbsp;синтаксис конфигурационного файла.</p>\n<p class=\"rtejustify\"><strong>logfilename </strong>- указывается полное имя файла журнала, например /var/log/httpd-error.log. Здесь все понятно <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/teeth_smile.gif\" /></p>\n<p class=\"rtejustify\"><strong>[owner:group]</strong> - как уже писалось - необязательная опция. Это список из владельца и группы файла, разделенных двоеточием. Вот так: &quot;root:wheel&quot;. Newsyslog может изменять владельца и группу также и старых файлов журналов. По умолчанию владельцем устаревших журналов является пользователь root, группы wheel. Эту возможность вы можете с успехом применять на многопользовательских машинах. Также есть возможность&nbsp;указать изменение только владельца, или только группы. В этом случае&nbsp;необходимо использовать двоеточие с пустым местом там, где должен находиться неизменяемый параметр. Например &quot;:www&quot; сменит группу на &quot;www&quot;, а &quot;username:&quot; заменит владельца на &quot;username&quot;.</p>\n<p class=\"rtejustify\"><strong>mode - </strong>здесь проблем не должно быть. Указываем режим доступа к устаревшим файлам журналов в стандартном трехциферном Unix-формате.</p>\n<p class=\"rtejustify\"><strong>count </strong>- счетчик, указывающий newsyslog на количество хранимых устаревших журналов. Newsyslog начинает отсчет файлов с нуля. В то время как большинство программ начинают считать с нуля, newsyslog включает 0 &laquo;по умолчанию&raquo;, и считает файлы не учитывая нулевой. По умолчанию для журнала /var/log/massages счетчик равен пяти, при этом /var/log содержит следующие файлы: <br />\n&nbsp;</p>\n<p class=\"rtecenter\">messages<br />\nmessages.0.gz<br />\nmessages.1.gz<br />\nmessages.2.gz<br />\nmessages.3.gz<br />\nmessages.4.gz<br />\nmessages.5.gz</p>\n<p class=\"rtejustify\">\nТе из вас, кто может сосчитать количество файлов, видят, что их шесть, а не пять, плюс еще и текущий файл журнала. Как правило, иметь большее количество журналов лучше, чем испытывать в них недостаток . В то же время, если присутствует недостаток свободного пространства на винчестере, то иногда вы будете испытывать искушение удалить один-два излишних журнала. Похожая ситуация возникает в основном на веб-серверах, где размещено до нескольких сотен сайтов &ndash; несколько удаленных журналов каждого сайта в сумме могут составить достаточно большой объем свободного места.</p>\n<p class=\"rtejustify\"><strong>size</strong>&nbsp; и <strong>when </strong>- поля конфигурационной записи указывают newsyslog размер и/или &nbsp;время, при наступлении которых указанный файл необходимо подвергнуть ротации. Можно осуществлять ротацию по достижении определенного объема файла, или при наступлении определенного времени, или в обоих случаях. Если указаны оба условия, то ротация будет происходить при выполнении любого из них.</p>\n<p class=\"rtejustify\">Если размер или время не важны, то устанавливаем &quot;*&quot;, то есть &quot;любое значение&quot;. Например, если вы хотите проводить ротацию независимо от размера файла, то вместо указания размера необходимо поставить звездочку &quot;*&quot;.</p>\n<p class=\"rtejustify\">Поле <strong>size</strong>&nbsp;используется для указания размера в килобайтах. Когда newsyslog запускается он сравнивает размер файла с указанным, если файл больше, то производится его ротация.</p>\n<p class=\"rtejustify\">Поле <strong>when</strong>, указывающее время, заставляет плакать новичков в системном администрировании. Поле времени может содержать данные четырех типов: &laquo;звездочку&raquo;, число или два различных формата даты.</p>\n<p class=\"rtejustify\">Если вы не хотите производить ротацию журналов в определенное время, просто поставьте в это поле &laquo;звездочку&raquo;.</p>\n<p class=\"rtejustify\">Если в поле будет число, то newsyslog будет проводить ротацию по прошествии указанного количества часов. Например, если вы хотите, что бы ротация проводилась каждые 24 часа, и вам не важно в какое именно время, то просто поставьте в это поле число &laquo;24&raquo;.</p>\n<p class=\"rtejustify\">Если поле начинается символом &laquo;@&raquo;, то считается что время представлено в формате ISO-8601. Этот стандарт используется newsyslog в большинстве Unix-подобных операционных систем. Этот формат использовался первой версией newsyslog разработанной в MIT (Массачусетский Технологический Институт &ndash; прим. переводчика). На первый взгляд этот формат не совсем понятен. Но, поскольку это стандарт, FreeBSD его поддерживает.</p>\n<p class=\"rtejustify\">Полная запись даты в формате ISO-8601 состоит из 16 цифр с буквой &laquo;T&raquo; в середине. Первые четыре цифры означают год, следующие две &ndash; месяц, и еще две &ndash; день месяца. Буква &laquo;T&raquo; идет после даты, отделяя ее от времени, как десятичная точка в вещественных числах отделяет дробную часть от целой. После буквы &laquo;T&raquo; идут две цифры часа, затем две цифры минут и наконец две цифры секунд. Например дата 2 февраля 2002 года, 21:15:08, в формате ISO-8601будет выглядеть следующим образом:</p>\n<p class=\"rtejustify\">20020202T211508</p>\n<p class=\"rtejustify\"><strong><span style=\"color: #ff0000\">Вы обязательно должны ставить букву &laquo;T&raquo; в ISO-8601-дате.</span></strong></p>\n<p class=\"rtejustify\">Указание полных дат в формате ISO-8601 просто и очевидно. Путаница начинается, когда вы не пишете полную дату. Вы можете указать поля даты только рядом с буквой &laquo;T&raquo;, оставив остальное место незаполненным. Все неуказанные поля не будут учитываться при сравнении.</p>\n<p class=\"rtejustify\">Например T23 значит &ndash; любой день в году, 23:00. Если вы напишете в newsyslog.conf @T23, то ротация этого журнала будет проводиться каждый день, ровно в 23:00. Запись 4T00 значит полночь 4 числа каждого месяца, таким образом @4T00 будет запускать ротацию в это время.</p>\n<p class=\"rtejustify\">Так же как при работе с crontab вам следует уточнить часы ротации. Указание даты типа @7T будет запускать ротацию один раз в час, каждый час седьмого числа каждого месяца. Таким образом такая дата будет запускать ротацию раз в час на протяжении целого дня. Это может быть полезно для отладки, но вряд ли пригодится в реальной жизни.</p>\n<p class=\"rtejustify\">Эта система имеет одну серьезную проблему &ndash; она не дает простого способа задавать ежедневно выполняемые задачи. Желание запустить ротацию журнала по понедельникам, не является чем-то необычным. Запустить ротацию журнала в последний день месяца таким образов вообще не удастся. Тут на помощь приходит второй формат времени.</p>\n<p class=\"rtejustify\">Если запись времени начинается со знака доллара &quot;$&quot;, то считается, что время задается в специфическом FreeBSD-формате &laquo;месяц-неделя-день&raquo;. Это очень похоже на cron и позволяет вам установить конкретные дни недели для выполнения задачи.</p>\n<p class=\"rtejustify\">Этот формат использует три буквенных идентификатора: M (день месяца), W (день недели), H (час дня). После каждого из них идет число, указывающее точное время запуска. Часы находятся в интервале от 0 до 23, дни недели от 0 (воскресенье), до 6 (суббота). Дни месяца: от 1 и до количества дней в конкретном месяце.</p>\n<p class=\"rtejustify\">Например для запуска ротации каждое воскресение в 8 утра вам следует задать время как $W0H8. Если вы захотите ротировать журналы в полдень 5 числа каждого месяца, то напишите $M5H12.</p>\n<p class=\"rtejustify\">Одна интересная функция этой системы позволяет вам автоматически задавать ротацию на последний день месяца используя специальный &laquo;день месяца&raquo; &ndash; &laquo;L&raquo; (от last &ndash; последний). Без этого знака было бы очень трудно задать ротацию журнала в последний день месяца без написания скрипта, который бы вставлял количество дней в конкретном месяце. Если вы хотите запустить ротацию вашего журнала аккаунтов за два часа до начала нового месяца, вы должны использовать запись $MLH22.</p>\n<p class=\"rtejustify\"><strong>flags </strong>- это поле необязательно для большинства журналов, однако для некоторых оно жизненно важно.</p>\n<p class=\"rtejustify\">Newsyslog вставляет сообщение &laquo;logfile turned over&raquo; в каждый вновь созданный файл журнала. Если журнал ведется в двоичном виде (как например /var/log/wtmp), то добавление такого сообщения обязательно его испортит. Флаг &laquo;B&raquo; запрещает newsyslog\'у вставлять это сообщение.</p>\n<p class=\"rtejustify\">Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг &laquo;Z&raquo; укажет newsyslog, что старые журналы следует сжать gzip\'ом.</p>\n<p class=\"rtejustify\">Одновременно допускается использовать только один из этих флагов.</p>\n<p class=\"rtejustify\"><strong>[/pid_file]</strong>&nbsp;- задает путь к &laquo;pid-файлу&raquo; процесса пишущего журнал. Использование pid-файлов является простым способом записи поля ID процесса в системе, так что бы другие программы могли его легко прочитать. Большинство программ хранят свои pid-файлы в каталоге /var/run &ndash; поглядите них у себя на машине. Если в этом поле вы укажете полный путь к pid-файлу, то newsyslog будет посылать сигнал этому процессу когда будет производиться ротация. Например веб-сервер Apache должен быть оповещен при ротации его журналов. Записав в этом поле полный путь к его pid-файлу вы заставите newsyslog посылать процессу Apache сигнал kill -1, что бы он запустил свою часть обработки ротации журналов.</p>\n<p class=\"rtejustify\"><strong>[sig_num]</strong>&nbsp; - большинство программ поддерживают ротацию журналов сигналом kill -1 или SIGHUP. Некоторые программы требуют специального сигнала, когда их файлы ротируют. Если вы используйте программу такого типа, то укажите номер необходимого сигнала в последнем поле.</p>\n<p class=\"rtejustify\">Давайте соберем все сказанное вместе, в самом худшем случае, в примере, в который трудно поверить. Итак у вас есть журнал базы данных, который вы хотите ротировать в 23 часа в последний день каждого месяца. В документации базы данных сказано, что вы должны послать процессу базы сигнал прерывания (SIGINT или сигнал номер 2) после ротации. Вы хотите, что бы архивные журналы принадлежали пользователю &quot;dbmanager&quot; и читать их мог только он. Более того, журналы &ndash; двоичные файлы и должны быть не тронуты newsyslog\'ом. Ваш newsyslog.conf должен выглядеть следующим образом:</p>\n<p>/var/log/database dbmanager: 600 30 * $MLH23 B /var/run/db.pid 2&nbsp;</p>\n', created = 1767353218, expire = 1767439618, headers = '', serialized = 0 WHERE cid = '2:c35a3adcf1d4a4416a5718d1093fa42f' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767353218, expire = 1767439618, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767353218, expire = 1767439618, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другуPDF version

Вот на днях заметил лог-файл "дивного" обьема - 19,5 ГБ (сервер достался от предыдущего одмина, соответственно много чего интересного замечаю  ). Решил проинспектировать и нормально настроить ротацию логов. Ротацией логов во 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 

Ваша оценка: Нет Средняя: 4.7 (35 голосов)

Вставай, Україно!

Литература

Клавиатура Калашникова: Del-Del-Del-Del-...