首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Syslog

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

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

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

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

公共类方法

close() 显示源

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

代码语言:javascript
复制
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()时使用的工具编号

代码语言:javascript
复制
static VALUE mSyslog_facility(VALUE self)
{
    return syslog_opened ? INT2NUM(syslog_facility) : Qnil;
}

ident() 显示源

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

代码语言:javascript
复制
static VALUE mSyslog_ident(VALUE self)
{
    return syslog_opened ? rb_str_new2(syslog_ident) : Qnil;
}

inspect() 显示源

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
static VALUE mSyslog_instance(VALUE self)
{
    return self;
}

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

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

代码语言:javascript
复制
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

调试信息

每个优先级别还有一个快捷方式,以其优先级命名。作为一个例子,以下两个语句会产生相同的结果:

代码语言:javascript
复制
Syslog.log(Syslog::LOG_ALERT, "Out of memory")
Syslog.alert("Out of memory")

格式化字符串与printf / sprintf相同,除了%m被替换为由strerror(errno)返回的错误消息字符串。

代码语言:javascript
复制
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() 显示源

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

代码语言:javascript
复制
static VALUE mSyslog_get_mask(VALUE self)
{
    return syslog_opened ? INT2NUM(syslog_mask) : Qnil;
}

mask=(priority_mask) 显示源

设置日志优先级掩码。定义方法LOG_UPTO可以更容易地设置掩码值。例:

代码语言:javascript
复制
Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_ERR)

或者,可以选择特定的优先级并使用二进制或一起添加。例:

代码语言:javascript
复制
Syslog.mask = Syslog::LOG_MASK(Syslog::LOG_ERR) | Syslog::LOG_MASK(Syslog::LOG_CRIT)

优先级掩码通过调用open()和close()持续存在。

代码语言:javascript
复制
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

本地定义的设施。

例:

代码语言:javascript
复制
Syslog.open("webrick", Syslog::LOG_PID,
            Syslog::LOG_DAEMON | Syslog::LOG_LOCAL3)
代码语言:javascript
复制
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()相同。

代码语言:javascript
复制
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
    mSyslog_close(self);

    return mSyslog_open(argc, argv, self);
}

opened?显示来源

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

代码语言:javascript
复制
static VALUE mSyslog_isopen(VALUE self)
{
    return syslog_opened ? Qtrue : Qfalse;
}

options() 显示源

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

代码语言:javascript
复制
static VALUE mSyslog_options(VALUE self)
{
    return syslog_opened ? INT2NUM(syslog_options) : Qnil;
}

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

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

参数与open()相同。

代码语言:javascript
复制
static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
{
    mSyslog_close(self);

    return mSyslog_open(argc, argv, self);
}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com