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
Répondre
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"
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
Essayez
$stdout = File.new('/tmp/output', 'w')
Pour restaurer:
$stdout = STDOUT
Ça ne marcherait pas sans '$ stdout.sync = true'. –
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)
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
'.sync' est critique. –
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
Ou vous pouvez redéfinir la commande puts
? Fonctionne probablement dans un seul fichier/classe
def puts(message)
#write message to file
end
Utilisez cette 'ENREGISTREUR || = Logger.new ("| tee # {} settings.root /log/migration_script_logger.log", "mensuel")', ce fera les deux – vs4vijay