Системный журнал

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Системный журнал

Непрочитанное сообщение Olej » 16 авг 2012, 18:45

Olej писал(а): 2. как программа пишет лог, и как она определяет уровень логирования?
Т.е. как делает это любая программа, не обязательно демон службы...
Это легко понять на простейшей программке:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>

int main( int argc, char **argv, char **envp ) {
   int i;
   openlog( argv[ 0 ], LOG_NDELAY, LOG_USER );
// LOG_EMERG=0,   LOG_ALERT=1,  LOG_CRIT=2, LOG_ERR= 3
// LOG_WARNING=4, LOG_NOTICE=5, LOG_INFO=6, LOG_DEBUG=7
   for( i = LOG_EMERG; i <= LOG_DEBUG; i++ ) {
      syslog( i, "log. level = %d", i );
      printf( "done: log. level = %d\n", i );
   }
   closelog();
   return( EXIT_SUCCESS );
}
Константы уровня LOG_EMERG ... LOG_DEBUG определены, естественно, в файле заголовков /usr/include/syslog.h.

Соберите и запустите:

Код: Выделить всё

bash-4.2$ cc mylogs.c   -o mylogs
bash-4.2$ ./mylogs
done: log. level = 0
done: log. level = 1
done: log. level = 2
done: log. level = 3
done: log. level = 4
done: log. level = 5
done: log. level = 6
done: log. level = 7
Программа вывела 8 лог-сообщений (они дублировались в терминал).

Теперь смотрим системный журнал:

Код: Выделить всё

bash-4.2$ sudo cat /var/log/messages | tail -n7
Aug 16 18:30:12 notebook ./mylogs: log. level = 0
Aug 16 18:30:12 notebook ./mylogs: log. level = 1
Aug 16 18:30:12 notebook ./mylogs: log. level = 2
Aug 16 18:30:12 notebook ./mylogs: log. level = 3
Aug 16 18:30:12 notebook ./mylogs: log. level = 4
Aug 16 18:30:12 notebook ./mylogs: log. level = 5
Aug 16 18:30:12 notebook ./mylogs: log. level = 6
В журнал дошло только 7 лог-сообщений.

Вот так (очень огрублённо) работает отсылка в журнал из любой программы + фильтрация уровней демоном журналирования.
Вложения
logd.tgz
(3.44 КБ) 425 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Системный журнал

Непрочитанное сообщение Olej » 17 авг 2012, 01:05

И 3-й вопрос, из перечисленных в самом начале:
Olej писал(а): 3. как заставить конкретную программу писать детальные логи?
Кроме API openlog(), syslog() и т.д., определённых в /usr/include/syslog.h, и показанных в предыдущем примере, там есть ещё один интересный вызов - setlogmask():

Код: Выделить всё

bash-4.2$ man 3 setlogmask
NAME
       setlogmask - set log priority mask

SYNOPSIS
       #include <syslog.h>

       int setlogmask(int mask);

DESCRIPTION
       A  process  has  a  log  priority  mask  that  determines which calls to syslog(3) may be logged.  All other calls will be
       ignored.  Logging is enabled for the priorities that have the corresponding bit set in mask.  The  initial  mask  is  such
       that logging is enabled for all priorities.
...
Т.е. процесс сам может сам замаскировать какие уровни логирования от него не будут доходить до демона журнала (или не будут логироваться демоном, но результат здесь один).
Это даёт возможность процессу легко изменять те уровни лог-сообщений, которые от него будут логироваться.

Но то, как именно это будет выглядеть с точки зрения пользователя - зависит от разработчика конкретной программы.
Один пример тому приводили:
Ali писал(а): В/etc/ppp/ppp.options добавить переменную:

Код: Выделить всё

debug  # см. man pppd

Где-то я видел изменение уровня логирования опцией -v при запуске (так же как управляют уровнем диагностики в терминал), и с изменением уровня детализации логов от числа: -v, -vv, -vvv и т.д.

Т.е. в итоге:
- программа может и со своей стороны (помимо демона журнала) определять какой детальности протоколирование она будет делать в журнал ...
- но то, каким образом это будет определяться - зависит от конкретной реализации этой программы ...
- смотрите man.
man, man, и ещё раз man
(с) дедушка Ленин. ;-)

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей