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