模块 Syslog
常量
- VERSION
Syslog宏
公共类方法
关闭 syslog 设备。如果它未打开,则引发运行时异常。
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;
}
返回上次调用 open() 时使用的设备编号
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;
}
返回一个总结对象状态的 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);
}
为了向后兼容,返回 self。
static VALUE mSyslog_instance(VALUE self)
{
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")
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;
}
返回生效的日志优先级掩码。掩码不会因打开或关闭 syslog 而重置。
static VALUE mSyslog_get_mask(VALUE self)
{
return syslog_opened ? INT2NUM(syslog_mask) : Qnil;
}
设置日志优先级掩码。定义了一个方法 LOG_UPTO,以使其更容易设置掩码值。示例
Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_ERR)
或者,可以使用二进制 OR 来选择特定的优先级并将它们加在一起。示例
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;
}
打开 syslog 设备。如果它已经打开,则引发运行时异常。
可以在带或不带代码块的情况下调用。如果使用代码块调用,则创建的 Syslog 对象将传递给该代码块。
如果 syslog 已打开,则会引发 RuntimeError。
ident 是一个标识调用程序的字符串。
options 是以下任一项的逻辑 OR
- LOG_CONS
-
如果在发送到系统日志记录器时发生错误,则直接写入控制台。
- LOG_NDELAY
-
现在打开连接,而不是等待写入第一条消息。
- LOG_NOWAIT
-
不要等待日志消息时创建的任何子进程。(在 Linux 上不起作用。)
- LOG_ODELAY
-
与 LOG_NDELAY 相反;等待发送消息后再打开连接。(这是默认值。)
- LOG_PERROR
-
将消息打印到 stderr,并将其发送到 syslog。(不在 POSIX.1-2001 中。)
- LOG_PID
-
在每条消息中包含当前进程 ID。
facility 描述打开 syslog 的程序类型,是为宿主操作系统定义的以下任一项的逻辑 OR
- 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 至 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;
const char *ident_ptr;
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");
}
ident_ptr = StringValueCStr(ident);
syslog_ident = strdup(ident_ptr);
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;
}
关闭然后重新打开 syslog。
参数与 open() 的参数相同。
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
mSyslog_close(self);
return mSyslog_open(argc, argv, self);
}
如果 syslog 已打开,则返回 true。
static VALUE mSyslog_isopen(VALUE self)
{
return syslog_opened ? Qtrue : Qfalse;
}
返回上次调用 open() 时使用的选项位掩码
static VALUE mSyslog_options(VALUE self)
{
return syslog_opened ? INT2NUM(syslog_options) : Qnil;
}
关闭然后重新打开 syslog。
参数与 open() 的参数相同。
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
mSyslog_close(self);
return mSyslog_open(argc, argv, self);
}