5

我很新玩系统日志。

我们决定使用 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

4 回答 4

14

绝对syslogruby​​ 实现不允许我们使用自定义工具

syslogruby 实现使用[ syslogC implementation] ( 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已经存在的设施之一供个人使用。

现在我可以像这样配置系统日志:

# /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希望您定义自定义设施的方式。

于 2010-10-29T12:44:50.457 回答
3

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

这也是为什么您必须使用像 rsyslog 这样的缓冲系统记录器的原因,否则它会影响您的性能。(我相信 syslogd 使用 fsync() 这是一个等待返回的同步调用。)

于 2011-10-27T10:00:00.787 回答
3

看看伐木工人

它支持将 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 还有很多其他值得一看的功能。

于 2011-10-27T13:22:28.500 回答
0

您可能想研究 using Logger,它与 syslog 非常相似,只是它对用户更友好一些。它具有多个关键级别,如 Syslog,并提供基于大小或年龄的日志滚动。

于 2010-10-28T11:00:05.917 回答