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
Odpowiedz
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"
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
Spróbuj
$stdout = File.new('/tmp/output', 'w')
Aby przywrócić:
$stdout = STDOUT
To nie będzie działało dla mnie bez '$ stdout.sync = true'. –
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)
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
'.sync' jest krytyczny. –
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
Lub możesz przedefiniować polecenie puts
? Działa chyba tylko w jednym pliku/klasy
def puts(message)
#write message to file
end
Użyj tego 'LOGGER || = Logger.new ("| tee # {settings.root} /log/migration_script_logger.log", "co miesiąc")', to zrobi zarówno – vs4vijay