Ruby& Syslog&定制设施

时间:2010-10-28 10:49:32

标签: ruby syslog

我是新玩的系统日志。

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

问题在于我不想使用默认的/var/log/system.log文件,而是使用/var/log/myapp_events.log之类的自定义文件。

我知道为此我必须在/etc/syslog.conf中定义我自己的设施,如下所示:

myapp_events.* /var/log/myapp_events.log

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

syslog -s -k Facility myapp_events Message "this is my message"

消息按预期显示在/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.

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

有什么建议吗?

4 个答案:

答案 0 :(得分:13)

syslog ruby​​实现肯定不允许我们使用自定义设施

syslog ruby​​实现正在使用syslog [C实现](http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36)。

syslog C实现仅允许我们使用非常短的设施名称列表: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

在Ruby中这样做:

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

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

答案 1 :(得分:3)

当您有多个工作线程或线程时,记录器无用,因为日志消息会交错。这就是Rails 3中的默认记录器是BufferedLogger的原因。

这也是你必须使用像rsyslog这样的缓冲syslogger的原因,否则会导致你的性能下降。 (我相信syslogd使用fsync(),这是一个等待返回的同步调用。)

答案 2 :(得分:3)

看看Lumberjack

它支持Syslog作为日志设备,您可以指定设施作为选项:

require 'lumberjack'
require 'lumberjack_syslog_device'

syslog_device = Lumberjack::SyslogDevice.new(:facility => 'myapp_events')
logger = Lumberjack::Logger.new(syslog_device)
logger.info "Hello, Syslog!"

Lumberjack还有很多其他功能值得一看。

答案 3 :(得分:0)

您可能希望使用Logger,这与syslog非常相似,只是它更加用户友好。它具有多个关键级别,如Syslog,并根据大小或年龄提供日志滚动。