Следует осторожно подходить к выводу информации через /dev/console или псевдотерминал. Если кто нажмет комбинацию Ctrl+S вывод на консоль прекратится функции syslog заблокируются и система может тормозить.
18.4 logrotate или "что делать со старыми журналами?"
Запускается ежедневно cron-ом (/etc/cron.daily/logrotate) и позволяет обрабатывать журналы, если они превысили указанный размер или с указанным временным интервалом. Позволяет обрабатывать не только журналы syslog, но и любых других программ. Параметры:
· [-d] (отладочный режим, реальных изменений не производится)
· [-f] (производить изменения, даже если logrotate не видит необходимости - используется при изменениях в списке обрабатываемых журналов)
· [-s имя-файла-состояния] (текущее состояние журналов хранится в этом файле между запусками, по умолчанию - /var/lib/logrotate.status)
· имена-конфигурационных-файлов (имена через пробел; порядок имеет значение; если указано имя директории, то каждый файл в ней считается конфигурационным; в RH используется файл /etc/logrotate.conf и директория /etc/logrotate.d)
Конфигурационный файл определяет глобальные параметры (по одному на строке), задающие параметры по умолчанию для всех журналов. Для каждой серии обрабатываемых журналов задаются локальные параметры: указывается базовое имя файла, а затем в фигурных скобках локальные параметры по одному на строке. Имя файла может быть заключено в кавычки по правилам shell, если оно содержит пробелы и другие специальные символы. Можно указывать несколько имен файлов или шаблонов имен файлов через пробел (шаблоны также по правилам shell). Обработка каждой секции рассматривается как единое действие. Строки, начинающиеся с символа "#" являются комментраиями. Параметры, указанные в следующем конфигурационном файле перекрывают значение параметров, указанных в предыдущем файле. Локальные параметры имеют приоритет над глобальными. Порядок файлов в конфигурационной директории не определен.
Параметры:
· compress | nocompress (старые версии сжимаются или не сжимаются с помощью gzip)
· compresscmd (задает программу сжатия, по умолчанию - gzip)
· uncompresscmd (задает программу разжатия, по умолчанию - ungzip)
· compressext (задает суффикс для сжатых файлов)
· compressoptions (задает параметры программы сжатия; по умолчанию - "-9", т.е.
максимальное сжатие для gzip)
· copytruncate | nocopytruncate (обычно старая версия переименовывается и создается новая версия журнала; при задании этого параметра logrotate копирует журнал в новый файл, а затем обрезает старый; используется, если программа, создающая журнал, не умеет его закрывать; теряются записи, сделанные в промежутке между
· копированием и обрезанием; а поможет ли, если создающая журнал программа вместо режима append просто пишет в файл, используя внутренний указатель?)
· create [права-доступа владелец группа] | nocreate (сразу после переименования старой версии журнала и до вызова postrotate создается новый журнал с указанными атрибутами - права доступа задаются в восьмеричном виде, как в chmod.2; если атрибуты не указаны, то берутся от старого журнала)
· daily (смена версий в серии происходит ежедневно)
· delaycompress | nodelaycompress (некоторые программы не сразу закрывают журнал, в этом случае сжатие надо отложить до следующего цикла)
· errors email (кому направлять сообщения об ошибках)
· extension суффикс (задается суффикс, добавляемый к именам файлов при ротации перед суффиксом сжатия)
· ifempty | notifempty (смена версий даже если файл пуст; действует по умолчанию)
· include имя-файла | имя-директории (текстуально подставить файл или все файлы из указанной директории; не включаются поддиректории, специальные файлы и файлы с суффиксами из списка исключений; нельзя использовать внутри секции)
· mail адрес | nomail (когда смена версий приводит к необходимости удалить старый журнал, то послать его по указанному адресу)
· mailfirst (посылать не удаляемую версию журнала, а первую)
· maillast (посылать удаляемую версию журнала; действует по умолчанию)
· missingok | nomissingok (не посылать сообщения об ошибке, если журнал отсутствует)
· monthly (смена версий происходит ежемесячно)
· olddir директория | noolddir (во время смены версий журнал перемещается в указанную директорию; д.б. на том же физическом устройстве)
· postrotate (все дальнейшие строчки до строки endscript исполняются как команды shell после процесса смены версии)
· prerotate (все дальнейшие строчки до строки endscript исполняются перед процессом смены версии)
· rotate число (сколько старых версий хранить; если 0, то ни одной)
· size байт (смена версии происходит, если размер журнала превысил указанное число;
· можно использовать суффиксы "k" - килобайт - и "M" - мегабайт)
· sharedscripts | nosharedscripts (выполнять команды prerotate и postrotate только один раз для всех файлов, описанных в секции)
· tabooext [+] список-суффиксов (задание списка суффиксов-исключений для include;
· если указан знак "плюс", то дополнение, иначе замена; по умолчанию: .rpmorig,
· .rpmsave, .rpmnew, ",v", .swp и "~")
· weekly (смена версий происходит еженедельно)
В поставке SLES8 /etc/logrotate.conf описывает глобальные параметры и ссылается на директорию /etc/logrotate.d, в которую каждый пакет записывает локальные параметры для своих журналов.
# see "man logrotate" for details
# rotate log files weekly weekly
# keep 4 weeks worth of backlogs rotate 4
# create new (empty) log files after rotating old ones create
# uncomment this if you want your log files compressed
#compress
# uncomment these to switch compression to bzip2
#compresscmd /usr/bin/bzip2
#uncompresscmd /usr/bin/bunzip2
# RPM packages drop log rotation information into this directory include /etc/logrotate.d
# no packages own lastlog or wtmp -- we'll rotate them here
#/var/log/wtmp {
# monthly
# create 0664 root utmp
# rotate 1
#}
# system-specific logs may be also be configured here.
18.5 logwatch или "как извлечь полезную информация из кучи мусора?"
logwatch представляет собой платформу (framework) для написания программ (называемых фильтрами) извлечения полезной информации из многочисленных, больших и разноформатных журналов (не только syslog). В "пакете" приходит несколько фильтров, рассчитанных на Red Hat Linux (какой-то древней версии, т.к. упоминается inetd вместо xinetd), но адаптировать их под конкретную ситуацию придется самому. Последнее изменение было внесено автором в сентябре 2000, так что дальнейшего развития можно уже не ждать.
Фильтры могут быть написаны на любом языке программирования, но автор пакета предпочитает perl. Фильтры должны быть написаны так, что читают данные с stdin и выводят результат на stdout. Перед вызовом фильтра устанавливаются переменные окружения: LOGWATCH_DATE_RANGE, LOGWATCH_DETAIL_LEVEL, LOGWATCH_TEMP_DIR, LOGWATCH_DEBUG. Основная программа также написана на perl:
/etc/log.d/scripts/logwatch.pl (/etc/log.d/logwatch, /usr/sbin/logwatch и /etc/cron.daily/00- logwatch - это символьные ссылки на нее).
Директория /etc/log.d/conf/logfiles/ содержит конфигурационные файлы групп журналов, в которых хранятся записи обслуживаемых сервисов. Каждая группа описывается отдельным файлом имя-группы.conf, в котором задаются:
· LogFile = имя файла, содержащего журнал, или шаблон имен; можно задавать несколько имен или шаблонов; имена м.б. относительно LogDir
· Archive = имя файла, созданного logrotate архивной версии журнала, или шаблон имен; можно задавать несколько имен или шаблонов; имена м.б. относительно LogDir имена фильтров (только по одному разу, хотя в показано другое!) из /etc/log.d/scripts/shared/ в виде *имя-фильтра = параметры, например, чтобы отфильтровать журнал по дате, если она записана в стандартном формате syslog, надо использовать строку: *ApplyStdDate =
Директория /etc/log.d/conf/services/ содержит конфигурационные файлы сервисов, чьи записи в журналах logwatch будет обрабатывать. Каждый сервис описывается отдельным файлом имя-сервиса.conf, в котором задаются:
· LogFile = имя группы журналов
· имена фильтров из /etc/log.d/scripts/shared/ в виде *имя-фильтра = параметры, запускаемых до фильтра сервиса
· $имя-переменной окружения = значение
Директория /etc/log.d/scripts/logfiles/ содержит фильтры обработки групп журналов: при обработке группы журналов все файлы в директории /etc/log.d/scripts/logfiles/имя-группы используются как фильтры.
Директория /etc/log.d/scripts/services/ содержит фильтры обработки записей конкретных сервисов.
Директория /etc/log.d/scripts/shared/ содержит общие фильтры, используемые в конфигурационных файлах групп журналов:
· applystddate - фильтрует журнал по требуемой дате, если он записан в формате syslog (здесь и в приватных фильтрах по дате навставлять LANG= перед вызовом date, а то Mar никак не совпадает с Мар ;)
· expandrepeat - превращает строки "last message repeated" в соответствующее число строк с текстом сообщения из предыдущей строки
· onlycontains - оставляет только те строки журнала, которые содержат указанную строку (я поставил кавычки вокруг "$*")
· onlyservice - выделяет из журнала в формате syslog строки, относящиеся к указанному сервису (имя сервиса передается как параметр)
· remove - оставляет только те строки журнала в формате syslog, которые не содержат указанную строку (я поставил кавычки вокруг "$*" и наделал remove1, remove2 и т.д. так как не понял как указать несколько подшаблонов для egrep в одной строке; кстати, параметры подставляются в shell, так что спецсимволы тоже нельзя использовать)
· removeheaders - удаление стандартных полей (дата, время, имя хоста, этикетка сервиса и номер процесса)
· removeservice - выделяет из журнала в формате syslog строки, не относящиеся к указанному сервису (имя сервиса передается как параметр)
Параметры по умолчанию хранятся в файле /etc/log.d/conf/logwatch.conf (/etc/log.d/logwatch.conf есть символьная ссылка на него), комментарии в котором позволяют понять смысл параметров:
· LogDir - директория, относительно которой рассматриваются имена файлов
· MailTo - кому отправлять отчет
· Print - вместо посылки отчета по почте выдать его на stdout
· Save - вместо посылки отчета по почте сохранит его в указанном файле
· Archives - использовать версии журналов, созданных logrotate
· Range - рассматриваемый временной интервал: All, Today, Yesterday (вчерашние календарные сутки)
· Detail - уровень подробности отчета: от 0 до 10 или Low, Med, High
· Service - All или имя фильтра из /etc/log.d/scripts/services/ (можно указывать несколько фильтров)
· LogFile - All или имя группы журналов (можно указывать несколько групп)
Параметры запуска:
· --detail уровень (уровень продробности отчета: high, med или low)
· --logfile группа-журналов (обрабатывать только журналы данной группы; группа задается символическим именем в конфигурационном файле; можно задавать несколько групп)
· --service имя-сервиса (обрабатывать только те записи в журналах, которые относятся к данному сервису; сервис задается символическим именем в конфигурационном файле; можно задавать несколько сервисов; имя All вызывает обработку записей для всех сервисов)
· --print (выдавать отчет на stdout)
· --mailto адрес (послать отчет по указанному адресу)
· --save имя-файла (записать отчет в указанный файл)
· --archives (обрабатывать не только текущие версии журналов, но и созданные logrotate старые копии)
· --range интервал-дат (обрабатывать только те записи в журналах, которые относятся к данному интервалу времени: Yesterday, Today, All)
Основной способ использования состоит во включении файла 00-logwatch (начинается с "00", чтобы выполняться до logrotate) в директорию /etc/cron.daily, что вызывает ежедневное выполнение logwatch с параметрами по умолчанию.
К сожалению, все фильтры рассчитаны на то, что журналы записываются на том же хосте, на котором работает сервис.
CRON - планирование заданий
Для выполнения рутинных действий, таких, как ротация лог-файлов, очистка каталогов от временных файлов, регулярное резервное копирование и т.п. в UNIX® существуют специальные средства автоматизации: at (batch) и cron. Команда at предназначена для однократного выполнения программы или сценария оболочки в заданное время. Формат команды следующий:
at [-q queue] [-f file] [-mldv] TIME
-q queue определяет очередь заданий. По умолчанию для at имя очереди a, для batch имя очереди b. Может принимать значения a-z, A-Z. Очереди с более старшими буквами исполняются с пониженным приоритетом.
-f file файл, в котором записаны задания (команды) для исполнения.
-m отправить сообщение пользователю по электронной почте по завершении исполнения задания
-l показать очередь заданий (то же, что и atq)
-d удалить задание (то же, что и atrm)
-v показать время, в которое задание будет выполнено.
Для периодического регулярного выполнения заданий по расписанию используется cron. Демон crond запускается при инициализации системы из /etc/rc.d/rc или
/etc/rc.d/rc.local.
Он проверяет каталог /var/spool/cron на наличие файлов с именами пользователей, существующих в системе, каждую минуту. Cron также проверяет файл /etc/crontab и каталог / etc/cron.d/ . После выполнения задания вывод команд отправляется по электронной почте пользователю или тому, чей адрес указан в переменной MAILTO. Расписание заданий создается при помощи утилиты crontab.
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }
-u user позволяет системному администратору оперировать расписанием заданий другого пользователя. Если опция не задана, то имеется в виду расписание пользователя, запустившего crontab.
file – взять расписание из файла file. Если указать вместо имени файла -, используется стандартный ввод.
-l отображает текущее расписание на стандартный вывод
-r удаляет текущее расписание
-e вызывает редактор по умолчанию для редактирования расписания. По завершении редактирования расписание инсталлируется автоматически.
При редактировании по команде crontab -e или создании файла расписания используется следующий формат:
# Отправлять отчеты по email пользователю (необязательно, по
# умолчанию - себе) MAILTO=peter
# Собственно расписание заданий:
# мин(0-59) час(0-23) дата(1-31) мес(1-12) день_нед(0-7) команда
# Выполнять каждый день в 00:05
5 0 * * * /path/to/program
# Выполнять по первым числам каждые десять минут четных часов
*/10 */2 1 * * $HOME/bin/monthly
Поля, определяющие расписание (минута, час, дата, месяц, день_недели) могут быть представлены в форматах
конкретное значение (например, “5”). “*” - все возможные значения. список значений, разделенный запятыми (“1,3,6,15”).
промежуток значений (“3-12”), допускается комбинация со списком (“1-4,6,9,11-13”). кратные значения (“*/2” - каждое второе, “1-7/3” - каждое третье из промежутка) После инсталляции расписание загружается в память и проверяется каждую минуту.