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
Antwort
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"
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
Versuchen
$stdout = File.new('/tmp/output', 'w')
wieder her:
$stdout = STDOUT
Es würde nicht funktionieren ohne '$ stdout.sync = true'. –
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)
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
'.sync' ist kritisch. –
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
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
verwenden 'LOGGER || = Logger.new ("| T-Shirt # {} settings.root /log/migration_script_logger.log", "monatlich")', das wird beides machen – vs4vijay