2010-03-17 9 views
59

Sur une console bash, si je fais ceci:rails - sortie de la console Réorientation vers un fichier

cd mydir 
ls -l > mydir.txt 

L'opérateur> capte l'entrée standard, et redirige vers un fichier; donc je reçois la liste des fichiers dans mydir.txt au lieu de dans la sortie standard.

Y a-t-il un moyen de faire quelque chose de similaire sur la console des rails? J'ai une déclaration ruby ​​qui génère beaucoup d'impressions (~ 8k lignes) et j'aimerais pouvoir la voir complètement, mais la console ne "se souvient" que des 1024 dernières lignes environ. J'ai donc pensé à rediriger vers un fichier - Si quelqu'un connaît une meilleure option, je suis tout ouïe.

Répondre

77

Vous pouvez utiliser override $stdout pour rediriger la sortie de la console:

$stdout = File.new('console.out', 'w') 

Vous pouvez aussi avoir besoin d'appeler cette fois:

$stdout.sync = true 

Cela va rediriger toutes les sorties vers le fichier. Si vous souhaitez rediriger temporairement la sortie, assurez-vous de stocker la valeur d'origine de $stdout afin de pouvoir la modifier.

+0

Merci! Ceci est exactement ce que je cherchais. – kikito

+2

Cela n'a pas fonctionné pour moi jusqu'à ce que j'aie ajouté '$ stdout.sync = true'. Édité. –

+2

'$ stdout.reopen (" my.log "," w ")' semble être une solution plus élégante, vu à: http://stackoverflow.com/a/2480439/21217 – dain

3

Si vous écrivez le code suivant dans votre fichier d'environnement, cela devrait fonctionner.

if "irb" == $0 
    config.logger = Logger.new(Rails.root.join('path_to_log_file.txt')) 
end 

Vous pouvez également faire pivoter le fichier journal à l'aide

config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold) 

Pour vous connecter uniquement enregistrement actif opérations liées, vous pouvez faire

ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt')) 

Cela permet également d'avoir différentes config enregistreur/fichier pour différents environnements.

+0

Ceci est utile, mais l'autre réponse fait ce que je voulais d'une manière plus simple. Merci d'avoir pris le temps de répondre quand même. – kikito

2

Utilisez hirb. Il numérise automatiquement toute sortie en IRB qui est plus longue qu'un écran. Mettre cela dans une session de la console pour voir ce travail:

>> require 'rubygems' 
>> require 'hirb' 
>> Hirb.enable 

Pour en savoir plus sur la façon dont cela fonctionne, read this post.

+0

Merci d'avoir répondu, mais je ne cherchais pas la pagination; Je voulais tout voir sur une seule page. – kikito

101

Si vous êtes à la recherche d'une solution unique rapide, utilisez simplement ce qui suit:

irb(main):001:0> f = File.new("statements.xml", 'w') 
irb(main):002:0> f << Account.find(1).statements.to_xml 
irb(main):003:0> f.close 

Créer un appareil JSON

>> f = File.new(Rails.root + 'spec/fixtures/qbo/amy_cust.json', 'w') 
>> f << JSON.pretty_generate((q.get :customer, 1).as_json) 
>> f.close 
+0

Exactement ce que je cherchais, merci gentiment! – kermitology

+0

Il m'a donné 'NoMethodError: instructions de la méthode undefined 'pour # ' ou 'instructions de la méthode' non défini 'pour # ' :( – Magne

+4

Où est le fichier 'statements.xml' – SujitS

3

En utilisant Hirb, vous pouvez choisir de vous connecter seulement Sortie Hirb dans un fichier texte. Cela vous permet de toujours voir les commandes que vous tapez dans la fenêtre de la console, et juste la sortie du modèle ira dans le fichier.

De l'Hirb readme:

Bien que vues par défaut sont imprimées sur STDOUT, ils peuvent être facilement modifiés pour écrire partout:

# Setup views to write to file 'console.log'. 
>> Hirb::View.render_method = lambda {|output| File.open("console.log", 'w') {|f| f.write(output) } } 

# Doesn't write to file because Symbol doesn't have a view and thus defaults to irb's echo mode. 
>> :blah 
=> :blah 

# Go back to printing Hirb views to STDOUT. 
>> Hirb::View.reset_render_method 
+0

Merci pour cela, exactement ce que je cherchais! – sbonami

2

En dehors de la réponse de Veger, il est l'une des plus façon de le faire ce qui fournit également de nombreuses autres options supplémentaires.

Il suffit d'ouvrir votre répertoire rails du projet et entrez la commande:

rails c | tee output.txt 

commande tee a aussi beaucoup d'autres options que vous pouvez vérifier par:

man tee 
Questions connexes