我很新玩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有第三个参数,它是设施,但它必须是一个整数,而我拥有的是一个字符串。
任何建议?
I am very new playing with syslog.
We have decided to use syslog to track some special events in our Rails application.
The problem is that I don't want to use the default /var/log/system.log file but use a custom one like /var/log/myapp_events.log.
I see that for that I have to define my own facility in /etc/syslog.conf like this:
myapp_events.* /var/log/myapp_events.logAfter restarting syslogd I see that I can play with it directly into the bash console:
syslog -s -k Facility myapp_events Message "this is my message"The message appears into the /var/log/myapp_events.log as expected, but I cannot reproduce this behavior using the syslog ruby gem. I have tried:
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.I see that Syslog.open has a third argument which is the facility but it has to be an integer and what I have is a string.
Any suggestion?
最满意答案
绝对的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希望你定义自定义设施的方式 。
Definitely the syslog ruby implementation doesn't allow us to use custom facilities.
The syslog ruby implementation is using the syslog [C implementation] (http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36).
The syslog C implementation only allows us to use a very short list of facility names: 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.
So in the end what I did was to use one of the LOG_LOCALX facilities that are already there for personal use.
Now I can configure syslog like this:
# /etc/syslog.conf local5.* /var/log/myapp_events.logAnd in Ruby do this:
Syslog.open('myapp', Syslog::LOG_PID, Syslog::LOG_LOCAL5) { |s| s.info 'this is my message' }I think is the way that syslog wants you to define custom facilities.
更多推荐
发布评论