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
}