2008-10-22 14 views
16

Estoy trabajando en la creación de un daemon en Ruby usando la gema daemons. Quiero agregar salida del daemon en un archivo de registro. Me pregunto cuál es la forma más fácil de redirigir puts de la consola a un archivo de registro.Redirige el resultado del comando "puts" a un archivo de registro

+0

Utilice esta 'REGISTRADOR || = Logger.new ("| camiseta # {} settings.root /log/migration_script_logger.log", "mensual")', esta hará ambos – vs4vijay

Respuesta

13

que debe recomendar a utilizar registrador de rubí, es mejor que la pone, puede tener múltiples niveles de registro que se puede activar/desactivar: depuración, advierten, información, errores, etc.

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

utilizo paquete runit para gestionar los servicios de rubí, se ha svlogd de voluntad redirigir la salida al archivo de registro del demonio, escritura Aquí está una duración de proceso de registrador:

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

Esto realmente no responde la pregunta. ¿Qué sucede si no puede controlar quién está haciendo las _puts_ y desea capturar cosas que normalmente escribirían en STDOUT y en su lugar las escribiría en un archivo? – silvamerica

11

Trate

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

Para restaurar:

$stdout = STDOUT 
+2

No funcionaría para mí sin '$ stdout.sync = true'. –

34

Si necesita capturar tanto STDERR y stdout y no quiere recurrir a la tala, la siguiente es una solución sencilla adaptada de this post:

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

Gracias, eso funcionó muy bien junto con [esto] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby) ! – TheDeadSerious

+0

'.sync' es crítico. –

+2

¿Qué sucede si desea que las copias continúen yendo a la terminal, así como también al archivo de registro? p.ej. comportamiento como 'ruby myscript.rb | tee my.log' – wim

0

O puede redefinir el comando puts? Funciona probablemente sólo en un único archivo/clase

def puts(message) 
    #write message to file 
end 
Cuestiones relacionadas