2008-10-22 11 views
16

Pracuję nad utworzeniem demona w Ruby przy użyciu klejnotów demonów. Chcę dodać dane wyjściowe z demona do pliku dziennika. Zastanawiam się, jaki jest najprostszy sposób przekierowania puts z konsoli do pliku dziennika.Przekieruj dane wyjściowe polecenia "puts" do pliku dziennika

+0

Użyj tego 'LOGGER || = Logger.new ("| tee # {settings.root} /log/migration_script_logger.log", "co miesiąc")', to zrobi zarówno – vs4vijay

Odpowiedz

13

mam zaleca się stosowanie rubinowy rejestratora, to lepiej, niż stawia, można mieć wiele poziomów dziennika, które można włączyć/wyłączyć: debug, ostrzec, info, błąd itp

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

używam pakiet runit do zarządzania usługami rubin, to svlogd niż woli demon przekierować wyjście do pliku dziennika, tutaj jest uruchomienie skryptu do procesu rejestratora:

#!/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

To tak naprawdę nie odpowiada na pytanie. Co zrobić, jeśli nie możesz kontrolować, kto robi _puts_ i chcesz przechwycić rzeczy, które normalnie piszą do STDOUT i zamiast tego zapisują je do pliku? – silvamerica

11

Spróbuj

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

Aby przywrócić:

$stdout = STDOUT 
+2

To nie będzie działało dla mnie bez '$ stdout.sync = true'. –

34

Jeśli chcesz uchwycić zarówno STDERR i stdout i nie chcemy uciekać się do wyrębu, po to proste rozwiązanie adaptacją this post:

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

Dzięki, że działało potężne grzywny w połączeniu z [to] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-inrub) ! – TheDeadSerious

+0

'.sync' jest krytyczny. –

+2

co, jeśli chcesz, aby puts nadal przejść do terminalu, a także do pliku dziennika? na przykład zachowanie takie jak 'ruby myscript.rb | tee my.log' – wim

0

Lub możesz przedefiniować polecenie puts? Działa chyba tylko w jednym pliku/klasy

def puts(message) 
    #write message to file 
end 
Powiązane problemy