Bog BOS: Системный журнал в UNIX (syslog)
Обеспечивает запись в журнал (журналы,
системную консоль, почтовый ящик и др.)
сообщений от демонов (фоновых
процессов),
работающих на этом или других
компьютерах (через порт 514/udp).
Реализован в виде демона syslogd
(иногда еще и klogd для
обработки сообщений ядра).
Осуществляет
маршрутизацию сообщений в
зависимости от facility
(вид/тип/сорт источника
сообщений) и уровня
серьезности.
facility:
-
AUTH
(безопасность/права доступа)
-
AUTHPRIV
(безопасность/права доступа -
защищенный режим)
-
CRON (cron и at)
-
DAEMON (прочие демоны)
-
KERN (ядро)
-
LOCAL0 - LOCAL7 (для местного
использования)
-
LPR (принтер)
-
MAIL (почтовая система)
-
NEWS (Usenet)
-
SYSLOG
(генерируемые самим syslog)
-
USER (клиентские программы)
-
UUCP
-
MARK (регулярные отметки, info)
Уровень/приоритет ( в порядке
убыванния):
-
EMERG (система
неработоспособна)
-
ALERT (требуется
немедленное
вмешательство)
-
CRIT
(критическое состояние)
-
ERR (ошибка)
-
WARNING
(предупреждение)
-
NOTICE (все нормально, но важно)
-
INFO
(информационное сообщение)
-
DEBUG (отладочная печать)
Формат журнала. Каждая строка
содержит одну запись,
состоющую из полей,
разделенных пробелами:
-
дата в
стандартном текстовом формате:
-
сокращенное название месяца
-
день месяца
-
ЧЧ:ММ:СС
-
имя хоста (fqdn или
сокращенное)
-
текст сообщения (нормально
написанная программа в первом поле
сообщает свое имя и номер
процесса; cisco в первом поле выводит номер
сообщения)
Linux
RPM.
RH 6.0: sysklogd-1.3.31-6, RH 6.2: sysklogd-1.3.31-16.
Источник:
ftp://ftp.infodrom.north.de/pub/people/joey/sysklogd/
Запуск.
/etc/rc.d/rc?.d/S30syslog -> /etc/rc.d/init.d/syslog
Конфигурация и служебные файлы.
/etc/syslog.conf
Представляет собой набор правил
журнализации. Каждое правило состоит из
селектора и действия, которые
разделяются
табуляциями (в старых системах - Solaris 5) или
пробелами (Linux). Получив
сообщение для записи в журнал (от klogd, от
локальной или удаленной
программы), syslogd для каждого правила
проверяет не подходит ли
сообщение под шаблон,
определяемый
селектором. Если подходит, то
выполняется действие. Для одного
сообщения м.б. выполнено
произвольное
количество действий. Селектор состоит из двух
частей,
разделенных точкой: facility и
приоритет. Прописные и строчные буквы не
различаются. можно также
использовать числа (см. /usr/include/syslog.h).
Кроме
определенных в syslog.3 facilities, можно
указывать mark
(регулярные временные метки), security
(устаревший синоним для auth). Кроме
определенных в syslog.h
приоритетов можно
использовать warn (синоним для warning), error
(синоним для err), panic
(синоним для emerg).
Сообщения с
приоритетом, равным или выше
указанного в селекторе, и facility, равным
указанному в селекторе,
считается подходящим.
Звездочка перед точкой
соответствует любому facility, после точки -
любому приоритету. Слово none после точки -
никакому приоритету данного facility. Можно
указывать несколько facilities в одном
селекторе (через запятую). В одной строке можно
указывать несколько
селекторов
(семантика не ясна: если
использовать
позитивные селекторы, то
логическое ИЛИ, если
негативные - none и
восклицательный знак - , то
логическое И). В новом syslogd (linux)
перед
приоритетом можно поставить знак
равенства - селектору будут
соответствовать только
сообщения с указанным
приоритетом (но не с высшим);
восклицательный знак - не будут
соответствовать сообщения с
приоритетом равным или большим;
восклицательный знак и
равенство - не будут
соответствовать сообщения с
приоритетом равным
указанному. В качестве действия можно
указывать:
-
имя обычного файла (полный путь от корня), минус
перед именем отключает
синхронизацию записи;
-
поименнованные каналы - fifo (перед именем
ставится
вертикальная черта), сам канал д.б. создан перед
запуском syslogd командой mkfifo
-
терминал или консоль
-
@имя-хоста (передать
сообщений для удаленной
журнализации; если
удаленный сервер зависнет, то никаких
предупреждений не
выдается!)
-
список
пользователей (через запятую), на
терминалы которых будет послано
сообщение
-
звездочка для посылки
сообщения на все терминалы (wall)
Особенности syslog.conf для Solaris. При
разборе файла
конфигурации syslogd
сравнивает адрес loghost
(определяется в /etc/hosts, не через DNS) с
адресом своего
компьютера и при
совпадении определяет
переменную LOGHOST. Далее syslog.conf
пропускается через
макропроцесссор m4(1). В основном это
используется для того, чтобы один и тот же
конфигурационный файл можно было
использовать на
клиентских и серверном (с точки зрения syslog)
хостах.
/var/lock/subsys/syslog
/var/run/syslogd.pid
/var/run/klogd.pid
/usr/sbin/klogd
читает сообщения ядра (либо через /proc/kmsg, либо с
помощью системных вызовов),
определяет уровень,
преобразует адреса команд в имена
программ и передает
сообщение syslogd.
Параметры:
-
-c уровень
(сообщения данного уровня и менее будут
передаваться syslog, а большего
приоритета -
выводиться на консоль; по
умолчанию - 1?)
-
-d (отладочный режим)
-
-f имя-файла
(журнализовать в указанный файл вместо syslog)
-
-i
(перезагрузить символы модулей в уже
работающем klogd)
-
-I
(перезагрузить символы ядра и модулей в уже
работающем klogd)
-
-k имя-файла
(использовать указанный файл как
таблицу символов ядра)
-
-n (не уходить в фоновый режим;
необходим для запуска из init)
-
-o
(одноразовый режим -
журнализовать все
сообщения,
скопившиеся в буфере ядра и
завершить работу)
-
-s
(использовать только
системные вызовы и не
обращаться к /proc/kmsg для
получения исходных
сообщений)
-
-v (показать версию и
закончить работу)
-
-x (не
преобразовывать адреса в имена)
Уровни сообщений ядра
(определяется по цифре в угловых
скобках):
-
KERN_EMERG - 0 (system is unusable)
-
KERN_ALERT - 1 (action must be taken immediately)
-
KERN_CRIT - 2 (critical conditions)
-
KERN_ERR - 3 (error conditions)
-
KERN_WARNING - 4 (warning conditions)
-
KERN_NOTICE - 5 (normal but significant condition)
-
KERN_INFO - 6 (informational)
-
KERN_DEBUG - 7 (debug-level messages)
Сигналы:
-
SIGINT, SIGKILL, SIGTERM and SIGHUP -
завершение работы
-
SIGTSTP - остановить
журнализацию
-
SIGCONT -
возобновить, возможно выбрав другой
источник сообщений (/proc/kmsg или
системные вызовы)
-
SIGUSR1 -
перезагрузить символы модулей
-
SIGUSR2 -
перезагрузить символы ядра и модулей
/usr/sbin/syslogd
Параметры:
-
-a
дополнительный-прослушиваемый-сокет
(полезен для демонов, делающих chroot)
-
-d (отладочный режим)
-
-f
имя-конфигурационного-файла (по
умолчанию, /etc/syslog.conf)
-
-h (изменить обычное
поведение, при котором
сообщения, принятые от
удаленных хостов, не
передаются дальше для записи на
удаленном хосте)
-
-l
список-хостов (список хостов, имена
которых не должны
записываться в виде FQDN; через
двоеточие)
-
-m минут (интервал для
регулярных временных записей; по
умолчанию - 20; если 0, то не делать вообще)
-
-n (не уходить в фоновый режим;
необходим для запуска из init)
-
-p
прослушиваемый-сокет (по
умолчанию: /dev/log)
-
-r (разрешить
принимать сообщения от
удаленных хостов; firewall д.б.
приоткрыт; в /etc/services д.б.
определен syslog для 514/udp)
-
-s
список-доменов (обрезать из имен хостов имена
указанных доменов)
-
-v (показать версию и
закончить работу)
Сигналы (kill
-имя-сигнала `cat /var/run/syslogd.pid`)
-
SIGHUP -
реконфигурация
-
SIGTERM - завершение работы
-
SIGINT, SIGQUIT -
завершение работы, если
выключена отладка
-
SIGUSR1 -
включить/выключить отладку (только с
использованием ключа -d)
Запускается с правами root. Не меняет права
доступа к файлам. Если вынужден
создавать файл, то делает его с правами 644. При
необходимости
ограничить доступ к журналу,
соответствующий файл надо создать
вручную (или поменять права доступа). Особые
проблемы создает logrotate.
Документация:
klogd.8, syslogd.8, syslog.conf.5, sysklogd.8 (то же
самое, что syslogd.8), syslog.3.
Вспомогательные программы.
logger - запись
сообщения в журнал из
командной строки (sh, bash и др.).
Параметры:
-
[-i] (включать номер
процесса в сообщение)
-
[-s]
(дублировать сообщение на stderr)
-
[-f
имя-файла]
(сохранять сообщение в
указанном файле)
-
[-p facility.level] (по
умолчанию: user.notice)
-
[-u socket]
(записывать в указанный сокет, вместо
обращения к syslogd)
-
текст
сообщения
logrotate (версия 3.2-1/3.3.2-1) -
борьба с растущими
журналами: разбиение на куски, сжатие,
удаление и отправка по почте.
Запускается ежедневно cron-ом (/etc/cron.daily/logrotate).
Параметры:
-
[-d]
(отладочный режим, реальных
изменений не
производится)
-
[-f]
(производить изменения даже если нет
необходимости -
используется при
изменениях в списке
обрабатываемых журналов)
-
[-s
имя-файла-состояния]
(текущее состояние журналов
хранится в этом файле между
запусками, по умолчанию - /var/lib/logrotate.status)
-
имена-конфигурационных-файлов
(порядок имеет значение; если указано имя
директории, то каждый файл в ней
считается
конфигурационным; сейчас
используется /etc/logrotate.conf)
Конфигурационный файл
определяет глобальные
параметры (по одному на строке) и для
каждого
обрабатываемого журнала
локальные параметры
(указывается имя файла, а затем в
фигурных скобках локальные
параметры; имя файла может быть
заключено в кавычки) :
-
compress | nocompress (старые
версии сжимаются с помощью gzip)
-
copytruncate | nocopytruncate
(обычно старая версия
переименовывается и
создается новая версия журнала; при
задании этого параметра logrotate
копирует журнал в новый файл, а затем
обрезает старый;
используется,
еслипрограмма, создающая журнал, не умеет его
закрывать; теряются записи,
сделанные в
промежутке между
копированием и
обрезанием)
-
create
[права-доступа
владелец группа] | nocreate
(сразу после
переименования старой версии журнала и до
вызова postrotate
создается новый журнал с
указанными атрибутами - права доступа
задаются в
восьмеричном виде, как в chmod.2; если
атрибуты не указаны, то берутся от
старого журнала)
-
daily (смена версий
происходит ежедневно)
-
delaycompress | nodelaycompress
(некоторые программы не сразу
закрывают журнал, в этом случае сжатие надо
отложить до
следующего цикла)
-
errors email (кому
направлять сообщения об ошибках)
-
ifempty | notifempty (смена
версий даже если файл пуст;
действует по умолчанию)
-
include
имя-файла |
имя-директории
(текстуально
подставить файл или все файлы из
указанной директории; не
включаются
поддиректории,
специальные файлы и файлы с
суффиксами из списка
исключений)
-
mail адрес | nomail
(когда смена версий проводит к
необходимости удалить старый журнал, то
послать его по
указанному адресу)
-
missingok | nomissingok (не
посылать сообщения об ошибке, если журнал
отсутствует)
-
monthly (смена версий
происходит
ежемесячно)
-
olddir
директория | noolddir (во
время смены версий журнал
перемещается в указанную
директорию; д.б. на том же
физическом
устройстве)
-
postrotate (все
дальнейшие строчки до строки "endscript"
исполняются после процесса смены версии)
-
prerotate (все
дальнейшие строчки до строки "endscript"
исполняются до процесса смены версии)
-
rotate число
(сколько старых версий хранить; если 0, то ни
одной)
-
size байт (смена версии
происходит, если размер журнала
превысил указанное число; можно
использовать суффикс "k" -
килобайт - и "M" - мегабайт)
-
tabooext [+]
список-суффиксов (задание
списка
суффиксов-исключений для include; если
указан знак "плюс", то
дополнение, иначе замена; по
умолчанию: .rpmorig, .rpmsave, ",v" и ~)
-
weekly (смена версий
происходит
еженедельно)
Собственно /etc/logrotate.conf
описывает глобальные
параметры и параметры для /var/log/wtmp и /var/log/lastlog и
ссылается на
директорию /etc/logrotate.d, в
которую каждый пакет
записывает локальные
параметры для своих журналов.
swatch
Программирование (syslog.3).
Инициализация записи в журнал: openlog -
указывается
стандартный префикс,
добавляемый ко всем
последующим
сообщениям (обычно имя
программы, номер процесса в
квадратных скобках и
двоеточие); имя facility и опции. closelog -
завершить запись в журнал. syslog -
запись в журнал
(указывается facility,
приоритет и формат строки как в printf).
Местные
особенности.
Все журналы ведутся на одном
компьютере. На нем д.б. открыт firewall для 514/udp
(только для тех, кто имеет право). Запуск syslogd (/etc/rc.d/init.d/syslog)
д.б. с ключом -r. На
клиентских
компьютерах
конфигурируем syslog так, чтобы все
сообщения
передавались на syslog-сервер,
сообщения о фатальных ошибках
дублировались в /var/log/syslog, на
консоль и на терминалы
пользователей (пока кроме news - как
статистику
обсчитывать?). На linux также
сбрасывать в локальный файл local7 (boot.log).
Журнализация для cisco
ведется с facility - local0. Судя по
документации:
-
Нарушения ACL - уровень info.
-
Сбои в работе IOS или
оборудования - err.
-
Отладочный вывод - warning.
-
Подъем/падение
интерфейсов - notice.
-
Перезагрузка -info.
В реальности:
-
сбои - critical
-
Подъем/падение
интерфейсов (LINK-3_UPDOWN) - err
-
линейный протокол (LINEPROTO-5-UPDOWN, LINK-5-CHANGED) - notice
-
сообщения о
конфигурации (SYS-5-CONFIG_I) - notice
-
замечания по
конфигурации - warn
-
Нарушения ACL (SEC-6-IPACCESSLOG) -
уровень info
Журнализация ftpd - local3.
Журнализация account - local4.
Журнализация cyrus POP3/IMAP - local5.
Журнализация для tac_plus
ведется с facility - local6 .
Загрузка в linux - local7.
logrotate: хранить вечно, менять версии по
возможности реже
(ежемесячно, кроме squid),
сбрасывать в отдельные
директории (кроме squid) и сжимать (в
отложенном режиме, кроме ftpd, linuxconf, sendfax),
ошибки и удаляемые файлы посылать мне.
Привести в
соответствие параметры для syslog.
Время от времени syslogd RH 6.0
зависает (то ли
нагрузка чрезмерна, то ли SMP гадит) и явный memory leak.
Пытался включить запись
временных маркеров в
отдельный файл (/var/log/time_markers) и
регулярную проверку этого файла (check_syslogd.sh).
Если записей давно не было, то
убивается syslogd и делается /etc/rc.d/init.d/syslog restart
(просто restart не
срабатывает - зависает при попытке
записать в журнал ;). Однако даже
зависший syslogd
записывает маркеры (но не
работает) - пришлось
проверять один из обычных
журналов. В RH 6.2 memory leak исчез,
зависает он теперь не навсегда, а только на пару
минут.