web-dev-qa-db-fra.com

met vs logger dans Rails tâches de râteau

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

Cependant si je dis Rails.logger.info puis en mode développement je ne vois rien sur console. Je dois aller dans un fichier journal et le suivre.

Je voudrais idéalement utiliser Rails.logger.info et en mode développement dans la tâche de râteau, la sortie de l'enregistreur devrait également être envoyée à la console.

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

106
Nick Vanderbilt

Mettez ceci dans application.rb, ou dans une tâche de râteau initialiser le code

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

C'est Rails 3 code. Notez que cela remplacera la journalisation dans development.log. Si vous voulez à la fois STDOUT et development.log vous aurez besoin d'une fonction wrapper.

Si vous souhaitez ce comportement uniquement dans la console Rails, placez le même bloc de code dans votre ~/.irbrc.

55
shmichael

Vous pouvez créer une nouvelle tâche de râteau 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 de râteau, vous pouvez d'abord ajouter à_stdout pour obtenir les messages du journal stdout ou ne pas l'inclure pour que les messages soient envoyés dans le fichier journal par défaut

rake to_stdout some_task
30
Pete Brumm

Les tâches de râteau sont exécutées par un utilisateur, sur une ligne de commande. Tout ce qu'ils ont besoin de savoir immédiatement ("5 lignes traitées") doit être sorti sur le terminal avec puts.

Tout ce qui doit être conservé pour la postérité ("envoyé un e-mail d'avertissement à [email protected]") doit être envoyé au Rails.logger.

11
Jonathan Julian

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 fonctionnera pas via le serveur. Ouvrez simplement une nouvelle console et tail -f le fichier journal, ça fera l'affaire.

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

Le paramètre "-f" de la commande "tail" est encore plus utile dans certaines situations. Cela oblige tail à "suivre" la sortie du fichier. Initialement, la réponse sera la même que pour 'tail' seule - les dernières lignes du fichier seront affichées. Cependant, la commande ne revient pas à l'invite et continue à la place de "suivre" le fichier. Lorsque des lignes supplémentaires sont ajoutées au fichier, elles seront affichées sur le terminal. Ceci est très utile pour regarder 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 d'autres options de queue.

( via )

10
marcgg

Code

Pour Rails 4 et plus récent, vous pouvez utiliser Diffusion de l'enregistreur .

Si vous souhaitez obtenir à la fois STDOUT et la journalisation des fichiers pour les tâches de râteau en mode développement, vous pouvez ajouter ce code dans config/environments/development.rb:

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-Rails-rake-tasks
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

Tester

Voici une petite tâche Rake pour tester le code ci-dessus:

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

Fonctionnement rake stdout_and_log:test les sorties

HELLO FROM PUTS
HELLO FROM LOGGER

tandis que

HELLO FROM LOGGER

a été ajouté à log/development.log.

Fonctionnement rake stdout_and_log:test Rails_ENV=production les sorties

HELLO FROM PUTS

tandis que

HELLO FROM LOGGER

a été ajouté à log/production.log.

9
Eric Duminil

Que diriez-vous de créer un assistant d'application qui détecte quel environnement est en cours d'exécution et fait la bonne chose?

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

Appelez ensuite output_debug au lieu de put ou logger.info

4
naven87

Dans Rails 2.X pour rediriger l'enregistreur vers STDOUT dans les modèles:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Pour rediriger l'enregistreur dans les contrôleurs:

ActionController::Base.logger = Logger.new(STDOUT)
3
Tania R

Exécutez un travail d'arrière-plan avec '&' et ouvrez le script/la console ou autre chose. De cette façon, vous pouvez exécuter plusieurs commandes dans la même fenêtre.

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

note Peut devenir bâclé rapidement quand il y a beaucoup de sortie de journalisation.

2
Tom Maeckelberghe