2008-10-22 7 views
16

Je travaille sur la création d'un démon dans Ruby en utilisant la gemme daemons. Je veux ajouter la sortie du démon dans un fichier journal. Je me demande quel est le moyen le plus facile de rediriger puts de la console vers un fichier journal.Rediriger la sortie de la commande "puts" vers un fichier journal

+0

Utilisez cette 'ENREGISTREUR || = Logger.new ("| tee # {} settings.root /log/migration_script_logger.log", "mensuel")', ce fera les deux – vs4vijay

Répondre

13

Je recommande à utiliser un enregistreur de rubis, il est préférable que met, vous pouvez avoir plusieurs niveaux de journaux que vous pouvez activer/désactiver: debug, avertir, info, erreur, etc.

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

J'utilise paquet runit pour gérer les services de rubis, il a svlogd que la volonté rediriger la sortie démon fichier journal, le script ici est exécuté pour le processus de l'enregistreur:

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

Cela ne répond pas vraiment à la question. Que faire si vous ne pouvez pas contrôler qui fait le _puts_ et que vous voulez capturer des choses qui normalement écriraient à STDOUT et les écrire dans un fichier? – silvamerica

11

Essayez

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

Pour restaurer:

$stdout = STDOUT 
+2

Ça ne marcherait pas sans '$ stdout.sync = true'. –

34

Si vous devez capturer à la fois STDERR et STDOUT et ne veulent pas avoir recours à l'exploitation forestière, à la suite est une solution simple adaptée de this post:

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

Merci, cela a fonctionné très bien en conjonction avec [ce] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby) ! – TheDeadSerious

+0

'.sync' est critique. –

+2

que se passe-t-il si vous voulez que les puts se poursuivent au terminal, ainsi que pour enregistrer le fichier? par exemple. comportement comme «ruby myscript.rb | tee my.log' – wim

0

Ou vous pouvez redéfinir la commande puts? Fonctionne probablement dans un seul fichier/classe

def puts(message) 
    #write message to file 
end 
Questions connexes