5

私はsyslogで遊んでいるのがとても新しいです。

Rails アプリケーションでのいくつかの特別なイベントを追跡するために syslog を使用することにしました。

問題は、デフォルトのファイルを使用したくないのです/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"

メッセージは期待どおりに表示されますが、 syslog ruby​​ gem/var/log/myapp_events.logを使用してこの動作を再現できません。私が試してみました:

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機能である3番目の引数があることがわかります、それは整数でなければならず、私が持っているのは文字列です。

なにか提案を?

4

4 に答える 4

14

Ruby の実装では、カスタム機能syslogを使用することはできません。

syslogruby 実装はsyslog[C 実装] ( http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36 ) を使用しています。

C 実装ではsyslog、施設名の非常に短いリストしか使用できません: 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ことは、すでにある施設の 1 つを個人的に使用することでした。

これで、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を定義してほしい方法だと思います。

于 2010-10-29T12:44:50.457 に答える
3

ログメッセージがインターリーブされるため、複数のワーカーまたはスレッドがある場合、ロガーは役に立ちません。これが、Rails 3 のデフォルトのロガーが BufferedLogger である理由です。

これが、rsyslog のようなバッファリング syslogger を使用する必要がある理由でもあります。そうしないと、パフォーマンスが低下します。(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

syslog に非常に似ていますLoggerが、もう少しユーザーフレンドリーなだけです。Syslog のように複数レベルの重要度があり、サイズや経過時間に基づいてログをローリングします。

于 2010-10-28T11:00:05.917 に答える