113 votes

puts vs logger dans les tâches de rails rake

Dans une tâche rake, si j'utilise la commande puts, je vois la sortie sur la console. Cependant, je ne verrai pas ce message dans le fichier journal lorsque l'application sera déployée en production.

Cependant, si je dis Rails.logger.info, en mode développement, je ne vois rien sur la console. Il faut que j'aille dans le fichier journal et que je le suive.

Idéalement, j'aimerais utiliser Rails.logger.info et, en mode développement, dans la tâche rake, la sortie du logger devrait également être envoyée à la console.

Y a-t-il un moyen d'y parvenir ?

61voto

shmichael Points 1075

Mettez ça dans application.rb ou dans le code d'initialisation d'une tâche rake

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

Il s'agit du code Rails 3. Notez que cela va remplacer la journalisation vers development.log . Si vous voulez les deux STDOUT y development.log vous aurez besoin d'une fonction enveloppante.

Si vous souhaitez que ce comportement n'apparaisse que dans la console Rails, placez le même bloc de code dans votre fichier ~/.irbrc .

44voto

Pete Brumm Points 714

Vous pourriez créer une nouvelle tâche rake pour que cela fonctionne.

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

De cette façon, lorsque vous exécutez votre tâche rake, vous pouvez ajouter to_stdout en premier pour obtenir des messages de journal stdout ou ne pas l'inclure pour avoir des messages envoyés au fichier journal par défaut.

rake to_stdout some_task

13voto

Jonathan Julian Points 9172

Les tâches Rake sont exécutées par un utilisateur, sur une ligne de commande. Tout ce qu'il doit savoir immédiatement ("a traité 5 lignes") doit être affiché dans le terminal avec la commande puts .

Tout ce qui doit être conservé pour la postérité ("envoyé un courriel d'avertissement à jsmith@example.com") doit être envoyé à l'adresse suivante Rails.logger .

10voto

marcgg Points 25599

Je dirais qu'en utilisant Rails.logger.info est la voie à suivre.

Vous ne pourrez pas le voir dans la console du serveur car il ne sera pas exécuté via le serveur. Ouvrez simplement une nouvelle console et tail -f le fichier journal, ça fera l'affaire.

De nombreux utilisateurs connaissent la commande " tail " d'UNIX® . qui peut être utilisée pour pour afficher les dernières lignes d'un grand fichier. Cela peut être utile pour visualiser des fichiers journaux, etc.

Encore plus utile dans certaines situations, c'est le paramètre '-f' de la commande 'tail'. de tail. Cela permet à tail de "suivre la sortie du fichier. Dans un premier temps, la réponse sera la même que pour que pour la commande 'tail' seule - les dernières lignes lignes du fichier seront affichées. Cependant, la commande ne retourne pas à l'invite, et continue plutôt à à " suivre " le fichier. Lorsque des lignes supplémentaires lignes supplémentaires sont ajoutées au fichier, elles seront affichées sur le terminal. Cette fonction est très utile pour observer les fichiers journaux, ou tout autre fichier qui peut être ajouté au fil du temps. Tapez 'man tail' pour plus de détails sur cette option et les autres et d'autres options de tail.

( via )

2voto

naven87 Points 588

Que diriez-vous de créer un assistant d'application qui détecte l'environnement en cours d'exécution et fait ce qu'il faut ?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

Ensuite, appelez output_debug au lieu de puts ou logger.info.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X