5 Stimmen

Ruby & Syslog & benutzerdefinierte Einrichtung

Ich bin sehr neu im Umgang mit Syslog.

Wir haben beschlossen, Syslog zu verwenden, um einige spezielle Ereignisse in unserer Rails-Anwendung zu verfolgen.

Das Problem ist, dass ich nicht die Standardeinstellungen verwenden möchte. /var/log/system.log Datei, sondern verwenden Sie eine benutzerdefinierte Datei wie /var/log/myapp_events.log .

Ich sehe ein, dass ich dafür meine eigene Einrichtung in /etc/syslog.conf así:

myapp_events.* /var/log/myapp_events.log

Nach dem Neustart von syslogd sehe ich, dass ich damit direkt in die Bash-Konsole :

syslog -s -k Facility myapp_events Message "this is my message"

Die Nachricht erscheint in der /var/log/myapp_events.log wie erwartet, aber ich kann dieses Verhalten nicht reproduzieren, wenn ich die syslog ruby gem . Ich habe es versucht:

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.

Ich sehe, dass Syslog.open hat ein drittes Argument, nämlich die Einrichtung aber es muss eine ganze Zahl sein, und was ich habe, ist eine Zeichenkette.

Haben Sie einen Vorschlag?

14voto

fguillen Punkte 32372

Eindeutig die syslog Ruby-Implementierung erlaubt es uns nicht, die benutzerdefinierte Einrichtungen .

Le site syslog Die Ruby-Implementierung verwendet die syslog [C-Implementierung] ( http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36 ).

Le site syslog Die C-Implementierung erlaubt uns nur die Verwendung einer sehr kurzen Liste von Einrichtungsnamen: 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 .

Letztendlich habe ich also eine der LOG_LOCALX Einrichtungen, die bereits für den persönlichen Gebrauch vorhanden sind.

Jetzt kann ich syslog wie folgt konfigurieren:

# /etc/syslog.conf
local5.*    /var/log/myapp_events.log

Und in Ruby tun Sie dies:

Syslog.open('myapp', Syslog::LOG_PID, Syslog::LOG_LOCAL5) { |s| s.info 'this is my message' }

Ich denke, das ist der Weg, den syslog möchte, dass Sie definieren benutzerdefinierte Einrichtungen .

3voto

Duke Punkte 6756

Logger ist nicht nützlich, wenn Sie mehrere Worker oder Threads haben, da die Protokollnachrichten ineinander verschachtelt werden. Dies ist der Grund, warum der Standard-Logger in Rails 3 BufferedLogger ist.

Dies ist auch der Grund, warum Sie einen puffernden Syslogger wie rsyslog verwenden müssen, da sonst die Leistung beeinträchtigt wird. (Ich glaube, syslogd verwendet fsync(), was ein synchroner Aufruf ist, der auf die Rückkehr wartet).

3voto

Lars Haugseth Punkte 14242

Werfen Sie einen Blick auf Holzfäller .

Es unterstützt Syslog als Protokollgerät, und Sie können die Einrichtung als Option angeben:

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 hat noch eine ganze Reihe anderer Funktionen, die es wert sind, dass man es sich ansieht.

0voto

the Tin Man Punkte 154584

Vielleicht sollten Sie die Verwendung von Logger das dem Syslog sehr ähnlich ist, nur ist es etwas benutzerfreundlicher. Wie Syslog verfügt es über mehrere Kritikalitätsstufen und bietet die Möglichkeit, Protokolle anhand ihrer Größe oder ihres Alters zu rollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X