Ruby 2.4

Syslog

module Syslog

syslog软件包为POSIX系统日志记录工具提供了一个Ruby界面。

系统日志消息通常传递给中央日志记录守护进程。守护进程可能会过滤它们; 将它们路由到不同的文件中(通常在/ var / log下找到); 将它们放在SQL数据库中; 通过TCP或UDP将它们转发到集中式日志记录服务器; 甚至通过电子邮件,寻呼机或短信提醒系统管理员。

与通过Logger或Log4r进行的应用程序级日志记录不同,syslog旨在允许安全防篡改日志记录。

系统日志协议在RFC 5424中进行了标准化。

公共类方法

close() 显示源

关闭系统日志工具。如果未打开,则引发运行时异常。

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; }

facility() 显示源

返回上次调用open()时使用的工具编号

static VALUE mSyslog_facility(VALUE self) { return syslog_opened ? INT2NUM(syslog_facility) : Qnil; }

ident() 显示源

返回上次调用open()时使用的标识字符串

static VALUE mSyslog_ident(VALUE self) { return syslog_opened ? rb_str_new2(syslog_ident) : Qnil; }

inspect() 显示源

返回汇总对象状态的inspect()字符串。

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 }

instance()显示源

为了向后兼容,返回self。

static VALUE mSyslog_instance(VALUE self) { return self; }

log(priority, format_string, *format_args) 显示源

记录具有指定优先级的消息。例:

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_log(int argc, VALUE *argv, VALUE self) { VALUE pri; rb_check_arity(argc, 2, UNLIMITED_ARGUMENTS 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; }

mask() 显示源

返回有效的日志优先级掩码。掩码不会通过打开或关闭系统日志来重置。

static VALUE mSyslog_get_mask(VALUE self) { return syslog_opened ? INT2NUM(syslog_mask) : Qnil; }

mask=(priority_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_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; }

open(ident, options, facility) → 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

在每条消息中包含当前进程ID。

facility 描述打开系统日志的程序的类型,并且是为主机操作系统定义的以下任何逻辑或:

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_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; }

reopen(ident, options, facility) → syslog Show source

关闭然后重新打开系统日志。

参数与open()相同。

static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self) { mSyslog_close(self return mSyslog_open(argc, argv, self }

opened?显示来源

如果系统日志已打开,则返回true。

static VALUE mSyslog_isopen(VALUE self) { return syslog_opened ? Qtrue : Qfalse; }

options() 显示源

返回上次调用open()时使用的选项位掩码

static VALUE mSyslog_options(VALUE self) { return syslog_opened ? INT2NUM(syslog_options) : Qnil; }

reopen(ident, options, facility) → syslog 显示源

关闭然后重新打开系统日志。

参数与open()相同。

static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self) { mSyslog_close(self return mSyslog_open(argc, argv, self }