2008-10-22 4 views
16

Ich arbeite an der Erstellung eines Dämons in Ruby mit dem Dämonen-Juwel. Ich möchte die Ausgabe aus dem Daemon in eine Protokolldatei hinzufügen. Ich frage mich, was ist der einfachste Weg, um puts von der Konsole in eine Protokolldatei umleiten.Umleiten der "puts" -Befehlsausgabe in eine Protokolldatei

+0

verwenden 'LOGGER || = Logger.new ("| T-Shirt # {} settings.root /log/migration_script_logger.log", "monatlich")', das wird beides machen – vs4vijay

Antwort

13

Ich sollte Rubin Logger empfehlen zu verwenden, es ist besser als Puts, können Sie mehrere Protokollebenen, die Sie ein-/ausschalten können: debug, warn, info, Fehler usw.

logger = Logger.new(STDOUT) 
logger = Logger.new("/var/log/my-daemon.log") 

ich benutze runit Paket ruby ​​Dienste zu verwalten, hat es svlogd als Wille umleiten Daemon Datei zu protokollieren, hier lief Skript für Logger-Prozess:

#!/bin/sh 
set -e 

LOG=/var/log/my-daemon 

test -d "$LOG" || mkdir -p -m2750 "$LOG" && chown nobody:adm "$LOG" 
exec chpst -unobody svlogd -tt "$LOG" 
+14

Das beantwortet die Frage nicht wirklich. Was ist, wenn Sie nicht kontrollieren können, wer die _puts_ ausführt und Sie Dinge erfassen möchten, die normalerweise in STDOUT schreiben und stattdessen in eine Datei schreiben? – silvamerica

11

Versuchen

$stdout = File.new('/tmp/output', 'w') 

wieder her:

$stdout = STDOUT 
+2

Es würde nicht funktionieren ohne '$ stdout.sync = true'. –

34

Wenn Sie sowohl STDERR und STDOUT erfassen müssen und wollen nicht, um die Protokollierung greifen, wird nach einer einfachen Lösung aus this post angepasst:

$stdout.reopen("my.log", "w") 
$stdout.sync = true 
$stderr.reopen($stdout) 
+0

Danke, das hat sehr gut funktioniert in Verbindung mit [dies] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby) ! – TheDeadSerious

+0

'.sync' ist kritisch. –

+2

Was ist, wenn Sie puts immer noch zum Terminal gehen wollen, sowie um die Datei zu protokollieren? z.B. Verhalten wie 'ruby myscript.rb | tee my.log' – wim

0

Oder Sie können den puts Befehl neu zu definieren? Funktioniert wahrscheinlich nur in einer einzigen Datei/Klasse

def puts(message) 
    #write message to file 
end