我是新玩的系统日志.
我们决定使用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
毫无疑问,syslog
ruby实现不允许我们使用自定义工具.
的syslog
红宝石实现使用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
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
希望您定义自定义设施的方式.