slogger
Утилита
системного логгирования
Синтаксис:
slogger [-c]
[-f уровень_серьезности] [-l журнал[,размер]]
[-s размер]
[-v[v]...]
Поддерживаемые платформы:
Neutrino
Опции:
-c
Открыть файл
журнала с использованием O_SYNC в целях принудительной фиксации
зарегистрированных событий на жестком диске.
-f уровень_серьезности
Регистрировать в файле журнала события, уровень
серьезности которых не ниже заданного. Эту опцию целесообразно
использовать только вместе с опцией -l; slogger всегда сохраняет все события в
своих внутренних буферах. Низшему уровню серьезности
соответствует значение 7, высшему уровню – 0. Значение по
умолчанию – 7.
-l журнал[,размер]
Записать в журнал копию каждого
события, числовое значение уровня серьезности которого меньше
или равно значению, заданному в опции -f. Если вслед за именем файла
введен необязательный аргумент размер, утилита slogger переключается от одного файла к
другому (журнал0 и журнал1), когда размер файла достигает заданного
значения.
-s размер
Вести в оперативной памяти буфер журнала, имеющий
заданный размер (в килобайтах), для хранения системных
сообщений. При переполнении буфера новые поступающие сообщения
записываются вместо наиболее старых сообщений. Размер по
умолчанию – 16 КБ.
-v[v]...
Вывести расширенную информацию; чем больше символов v, тем более подробная информация
выводится.
Описание:
Утилита slogger (системный логгер) является
центральным менеджером, осуществляющим регистрацию системных
сообщений от приложений. Сообщения сохраняются в циклическом
буфере и могут считываться по мере необходимости или в режиме
реального времени. При переполнении буфера новые сообщения
записываются вместо наиболее старых сообщений. Если
используются опции -l и -f, утилита slogger также записывает сообщения в файл
журнала (см. описание ниже).
Каждому
системному сообщению присваиваются уникальный старший код,
младший код и уровень серьезности. Предусмотрены следующие
уровни серьезности:
Имя в манифесте
|
Значение
|
Описание
|
_SLOG_SHUTDOWN
|
0
|
НЕМЕДЛЕННОЕ
завершение работы системы (например, в целях
использования OEM)
|
_SLOG_CRITICAL
|
1
|
Непредвиденная
критическая ошибка (например, ошибка жесткого диска)
|
_SLOG_ERROR
|
2
|
Непредвиденная
исправимая ошибка (например, необходимость сброса
аппаратного контролера)
|
_SLOG_WARNING
|
3
|
Предвиденная ошибка
(например, ошибка четности в последовательном порту)
|
_SLOG_NOTICE
|
4
|
Предупреждение
(например, "нет бумаги")
|
_SLOG_INFO
|
5
|
Информация
(например, "печатается страница 3")
|
_SLOG_DEBUG1
|
6
|
Сообщения отладки
(например, с обычной детализацией)
|
_SLOG_DEBUG2
|
7
|
Сообщения отладки
(например, с подробной детализацией)
|
Если задана опция -l журнал, утилита slogger создает отдельный поток,
сохраняющий каждое системное сообщение, которое имеет уровень
серьезности, определенный опцией -f.
Если
используется необязательный аргумент размер в опции -l, утилита slogger переключается от одного файла к
другому (журнал0 и журнал1). Когда размер файла достигает заданного
значения, утилита slogger закрывает
данный файл и открывает другой файл. Этот файл усекается до
нулевой длины, и в него записываются новые сообщения, пока
файл не будет заполнен. Затем эта процедура переключения
выполняется повторно. Таким образом, всегда существует два
файла; в одном из них содержатся самые последние сообщения, а
в другом – недавние сообщения.
Приложения,
которые не располагают стандартным потоком вывода,
отображаемым на консоли, должны использовать утилиту slogger для регистрации уведомлений,
предупреждений и ошибок. К таким приложениям относятся все
драйверы и менеджеры ресурсов.
Менеджер slogger создает следующие устройства в
пространстве имен:
/dev/slog
Используется
для чтения и записи системных журнальных сообщений.
/dev/console
Реализует простой консольный терминал ввода-вывода,
записывающий в системный журнал всю информацию, вводимую
пользователем на данном устройстве. При попытке чтения всегда
возвращается признак конца файла (end-of-file).
Приложение,
отправляющее новое системное журнальное сообщение, должно
обратиться к библиотечным подпрограммам slogb(), slogf(), slogi() и vslogf(). Эти
подпрограммы форматируют данные и осуществляют запись в файл /dev/slog.
Для
просмотра журнала используется утилита sloginfo. Приложение, считывающее системные
журнальные сообщения, может открыть файл /dev/slog для чтения и вызвать функцию
read(). В каждой операции чтения может
возвращаться одно или несколько сообщений, однако сообщения
никогда не разбиваются на части в одной операции чтения.
Открыть файл
/dev/slog для чтения
могут несколько приложений одновременно. Любое приложение
обращается к собственной копии данных и не влияет на работу
других приложений. Возможно использование нескольких фильтров,
работающих параллельно и обеспечивающих поиск определенных
журнальных сообщений. Ниже приведен пример простого фильтра
для вывода кодов и уровней серьезности:
#include
#include
#include
#include
#include
#include
int main(int
argc, char *argv[]) {
int
events[4096];
int *evp;
int n;
int wait = 0; //
Установить 1 для блокировки и вывода
// новых
событий при их поступлении.
int fd;
fd =
open("/dev/slog",
wait ? O_RDONLY
: O_RDONLY|O_NONBLOCK);
for(;;) {
int cnt;
// Чтение
некоторых событий.
n = read(fd,
events, sizeof(events));
if(n == -1) {
// Обычный
вариант для чтения без блокировки
// при
отсутствии событий.
if(errno ==
EAGAIN) {
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
// Преобразование
байтов
в целые числа (все события
// состоят
из целых чисел).
n /=
sizeof(int);
if(n == 0)
break;
for(evp = events
; evp < &events[n] ;
evp += cnt) {
int major,
minor, severity, txt;
time_t sec;
char
timebuf[60];
major =
_SLOG_GETMAJOR(evp[1]);
minor =
_SLOG_GETMINOR(evp[1]);
cnt =
_SLOG_GETCOUNT(evp[0]) +
_SLOG_HDRINTS;
severity =
_SLOG_GETSEVERITY(evp[0]);
txt =
_SLOG_GETTEXT(evp[0]);
sec = evp[2];
strftime(timebuf,
sizeof(timebuf),
"%h %d
%T", localtime(&sec));
printf("%s %d
%5d %2d ", timebuf,
severity, major,
minor);
if(txt)
printf("%s",
(char *)
&evp[_SLOG_HDRINTS]);
}
}
exit(EXIT_SUCCESS);
}
Для очистки буфера системного журнала можно вызвать unlink("/dev/slog") из программы,
либо rm /dev/slog из командного
интерпретатора.
Менеджер slogger используется вместо прежнего
сервиса системного журнала Unix syslogd. Библиотечные подпрограммы Unix
для syslogd выводят свои
сообщения в /dev/console. Менеджер slogger перехватывает и регистрирует этот
вывод.
Утилиту slogger следует запускать сразу же после
начальной загрузки системы (см. раздел Controlling How
Neutrino Starts ("Управление запуском Neutrino") в «Руководстве системного
программиста (администратора)» КПДА.10964-01 32. В противном
случае сообщения от менеджеров и драйверов, запускаемых перед
запуском данной утилиты, могут быть утрачены. Если уничтожить
(или не запускать) утилиту slogger, будут потеряны
все сообщения, отправляемые программами в системный журнал slogger. После запуска (или перезапуска)
утилиты slogger новые сообщения
направляются в новый системный журнал slogger.
Примеры:
Регистрация
системных сообщений:
slogger
Выделение в
оперативной памяти буфера размером 100Кб для системных
сообщений:
slogger -s 100k
В дополнение к сохранению в буфере в оперативной
памяти, запись в файл системных журнальных сообщений, имеющих
уровень серьезности 0, 1 или 2:
slogger -l
/var/logs/slogs -f 2
В дополнение к сохранению в буфере в оперативной
памяти, запись в файл всех системных журнальных сообщений.
Поскольку задана опция "размер", происходит переключение между
файлами журнала slogs0 и slogs1 (когда размер используемого файла
достигает 100 КБ):
slogger -l
/var/logs/slogs,100k