Ruby&Syslog和自定义工具

fgu*_*len 5 ruby syslog

我是新玩的系统日志.

我们决定使用syslog来跟踪Rails应用程序中的一些特殊事件.

问题是我不想使用默认/var/log/system.log文件,而是使用自定义文件/var/log/myapp_events.log.

我知道为此,我必须/etc/syslog.conf像这样定义我自己的设施:

myapp_events.* /var/log/myapp_events.log
Run Code Online (Sandbox Code Playgroud)

重新启动syslogd后,我发现我可以直接在bash控制台中使用它:

syslog -s -k Facility myapp_events Message "this is my message"
Run Code Online (Sandbox Code Playgroud)

消息显示在/var/log/myapp_events.log预期中,但我无法使用syslog ruby​​ gem重现此行为.我试过了:

require 'syslog'
Syslog.open('myapp_events', Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.warning 'this is my message' }  # sends the message to system.log
Syslog.open('myapp_events', Syslog::LOG_PID | Syslog::LOG_CONS, 'myapp_events') { |s| s.warning 'this is my message' }  # error because 'myapp_event' can't be converted to int.
Run Code Online (Sandbox Code Playgroud)

我看到Syslog.open有第三个参数是设施,但它必须是一个整数,我所拥有的是一个字符串.

有什么建议吗?

fgu*_*len 14

毫无疑问,syslogruby实现不允许我们使用自定义工具.

syslog红宝石实现使用syslog[C实现](http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36).

syslogC实现只允许我们使用设施的名称很短的名单:LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR, LOG_NEWS, LOG_UUCP, UUCP , LOG_CRON, LOG_AUTHPRIV, LOG_FTP, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7.

所以最后我做的是使用其中一个LOG_LOCALX已经存在的设施供个人使用.

现在我可以像这样配置syslog:

# /etc/syslog.conf
local5.*    /var/log/myapp_events.log
Run Code Online (Sandbox Code Playgroud)

在Ruby中这样做:

Syslog.open('myapp', Syslog::LOG_PID, Syslog::LOG_LOCAL5) { |s| s.info 'this is my message' }
Run Code Online (Sandbox Code Playgroud)

我认为是syslog希望您定义自定义设施的方式.