我是新玩的系统日志。
我们决定使用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
有第三个参数,即设施,但它必须是一个整数,我所拥有的是一个字符串。
有什么建议吗?
答案 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,并根据大小或年龄提供日志滚动。