модуль Syslog
Пакет syslog предоставляет Ruby-интерфейс к POSIX-утилите системного ведения журнала.
Syslog сообщения обычно передаются центральному демону ведения журнала. Демон может их фильтровать, направлять в разные файлы (обычно в папке /var/log), помещать в базы данных SQL, пересылать на централизованные серверы ведения журнала по TCP или UDP, а также оповещать администратора системы по электронной почте, пейджеру или текстовым сообщениям.
В отличие от ведения журнала на уровне приложения с помощью Logger или Log4r, syslog разработан для обеспечения безопасного и защищенного от подделки ведения журнала.
Протокол syslog стандартизирован в RFC 5424.
Публичные методы класса
static VALUE mSyslog_close(VALUE self)
{
if (!syslog_opened) {
rb_raise(rb_eRuntimeError, "syslog not opened");
}
closelog();
xfree((void *)syslog_ident);
syslog_ident = NULL;
syslog_options = syslog_facility = syslog_mask = -1;
syslog_opened = 0;
return Qnil;
} Закрывает системный модуль ведения журнала. Выбрасывает исключение runtime, если он не открыт.
static VALUE mSyslog_facility(VALUE self)
{
return syslog_opened ? INT2NUM(syslog_facility) : Qnil;
} Возвращает номер объекта, использованный в последнем вызове open()
static VALUE mSyslog_ident(VALUE self)
{
return syslog_opened ? rb_str_new2(syslog_ident) : Qnil;
} Возвращает строку идентификатора, использованную в последнем вызове open()
static VALUE mSyslog_inspect(VALUE self)
{
Check_Type(self, T_MODULE);
if (!syslog_opened)
return rb_sprintf("<#%"PRIsVALUE": opened=false>", self);
return rb_sprintf("<#%"PRIsVALUE": opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
self,
syslog_ident,
syslog_options,
syslog_facility,
syslog_mask);
} Возвращает строку inspect(), обобщающую состояние объекта.
static VALUE mSyslog_instance(VALUE self)
{
return self;
} Возвращает self для обеспечения обратной совместимости.
static VALUE mSyslog_log(int argc, VALUE *argv, VALUE self)
{
VALUE pri;
if (argc < 2) {
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2+)", argc);
}
argc--;
pri = *argv++;
if (!FIXNUM_P(pri)) {
rb_raise(rb_eTypeError, "type mismatch: %"PRIsVALUE" given", rb_obj_class(pri));
}
syslog_write(FIX2INT(pri), argc, argv);
return self;
} Ведение журнала сообщения с указанным приоритетом. Пример:
Syslog.log(Syslog::LOG_CRIT, "Out of disk space") Syslog.log(Syslog::LOG_CRIT, "User %s logged in", ENV['USER'])
Уровни приоритета, в порядке убывания:
- LOG_EMERG
-
Система непригодна для использования
- LOG_ALERT
-
Немедленно требуется принять меры
- LOG_CRIT
-
Произошла критическая ситуация
- LOG_ERR
-
Произошла ошибка
- LOG_WARNING
-
Предупреждение о возможной проблеме
- LOG_NOTICE
-
Произошла нормальная, но значительная ситуация
- LOG_INFO
-
Информационное сообщение
- LOG_DEBUG
-
Отладочная информация
Каждый уровень приоритета также имеет сокращенный метод, который ведет журнал с его именованным приоритетом. Например, следующие два утверждения дадут одинаковый результат:
Syslog.log(Syslog::LOG_ALERT, "Out of memory")
Syslog.alert("Out of memory")
Строки формата аналогичны printf/sprintf, за исключением того, что помимо этого %m заменяется на строку сообщения об ошибке, которая возвращается функцией strerror(errno).
static VALUE mSyslog_get_mask(VALUE self)
{
return syslog_opened ? INT2NUM(syslog_mask) : Qnil;
} Возвращает маску приоритета журнала, которая действует в настоящее время. Маска не сбрасывается при открытии или закрытии syslog.
static VALUE mSyslog_set_mask(VALUE self, VALUE mask)
{
if (!syslog_opened) {
rb_raise(rb_eRuntimeError, "must open syslog before setting log mask");
}
setlogmask(syslog_mask = NUM2INT(mask));
return mask;
} Устанавливает маску приоритета журнала. Метод LOG_UPTO определен для упрощения установки значений маски. Пример:
Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_ERR)
В качестве альтернативы, можно выбрать и добавить определенные приоритеты, используя побитовое ИЛИ. Пример:
Syslog.mask = Syslog::LOG_MASK(Syslog::LOG_ERR) | Syslog::LOG_MASK(Syslog::LOG_CRIT)
Маска приоритетов сохраняется при вызовах open() и close().
static VALUE mSyslog_open(int argc, VALUE *argv, VALUE self)
{
VALUE ident, opt, fac;
if (syslog_opened) {
rb_raise(rb_eRuntimeError, "syslog already open");
}
rb_scan_args(argc, argv, "03", &ident, &opt, &fac);
if (NIL_P(ident)) {
ident = rb_gv_get("$0");
}
SafeStringValue(ident);
syslog_ident = strdup(RSTRING_PTR(ident));
if (NIL_P(opt)) {
syslog_options = LOG_PID | LOG_CONS;
} else {
syslog_options = NUM2INT(opt);
}
if (NIL_P(fac)) {
syslog_facility = LOG_USER;
} else {
syslog_facility = NUM2INT(fac);
}
openlog(syslog_ident, syslog_options, syslog_facility);
syslog_opened = 1;
setlogmask(syslog_mask = setlogmask(0));
/* be like File.new.open {...} */
if (rb_block_given_p()) {
rb_ensure(rb_yield, self, mSyslog_close, self);
}
return self;
} Открывает системный модуль ведения журнала. Выбрасывает исключение runtime, если он уже открыт.
Может вызываться с или без блока кода. Если вызывается с блоком, созданный объект Syslog передаётся в блок.
Если syslog уже открыт, выбрасывает RuntimeError.
ident — это строка, идентифицирующая вызывающую программу.
options — логическое ИЛИ любого из следующих:
- LOG_CONS
-
Если при отправке в системный лог произошла ошибка, записывать непосредственно в консоль.
- LOG_NDELAY
-
Открыть соединение сейчас, а не ждать первого сообщения для записи.
- LOG_NOWAIT
-
Не ждать каких-либо дочерних процессов, созданных при ведении записей журналов. (Не имеет эффекта на Linux.)
- LOG_ODELAY
-
Противоположность LOG_NDELAY; ждать, пока сообщение не будет отправлено, прежде чем открыть соединение. (Это значение по умолчанию.)
- LOG_PERROR
-
Выводить сообщение в stderr, а также отправлять его в syslog. (Не в POSIX.1-2001.)
- LOG_PID
-
Включать текущий идентификатор процесса в каждое сообщение.
facility описывает тип программы, открывающей syslog, и является логическим ИЛИ любого из следующих значений, определенных для операционной системы:
- LOG_AUTH
-
Безопасность или авторизация. Устарело, используйте LOG_AUTHPRIV вместо.
- LOG_AUTHPRIV
-
Сообщения безопасности или авторизации, которые должны оставаться конфиденциальными.
- LOG_CONSOLE
-
Сообщение системной консоли.
- LOG_CRON
-
Планировщик системных задач (cron или at).
- LOG_DAEMON
-
Системный демон, у которого нет собственного значения объекта.
- LOG_FTP
-
Сервер FTP.
- LOG_KERN
-
Сообщение ядра (не отправляемое пользовательскими процессами, поэтому не очень полезно для Ruby, но указано здесь для полноты).
- LOG_LPR
-
Подсистема принтера.
- LOG_MAIL
-
Подсистема доставки или передачи почты.
- LOG_NEWS
-
Система новостей Usenet.
- LOG_NTP
-
Сервер протокола времени сети.
- LOG_SECURITY
-
Общее сообщение безопасности.
- LOG_SYSLOG
-
Сообщения, генерируемые внутренне syslog.
- LOG_USER
-
Общее сообщение на уровне пользователя.
- LOG_UUCP
-
Подсистема UUCP.
- LOG_LOCAL0 to LOG_LOCAL7
-
Локально определенные объекты.
Пример:
Syslog.open("webrick", Syslog::LOG_PID,
Syslog::LOG_DAEMON | Syslog::LOG_LOCAL3)
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
mSyslog_close(self);
return mSyslog_open(argc, argv, self);
} Закрывает и затем снова открывает syslog.
Аргументы такие же, как и для open().
static VALUE mSyslog_isopen(VALUE self)
{
return syslog_opened ? Qtrue : Qfalse;
} Возвращает true, если syslog открыт.
static VALUE mSyslog_options(VALUE self)
{
return syslog_opened ? INT2NUM(syslog_options) : Qnil;
} Возвращает битовую маску опций, использованную в последнем вызове open()
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
mSyslog_close(self);
return mSyslog_open(argc, argv, self);
} Закрывает и затем снова открывает syslog.
Аргументы такие же, как и для open().
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.