Sur une console bash, si je fais cela:
cd mydir
ls -l > mydir.txt
L'opérateur> capture l'entrée standard et la redirige vers un fichier; donc j'obtiens la liste des fichiers dans mydir.txt
au lieu de dans la sortie standard.
Existe-t-il un moyen de faire quelque chose de similaire sur la console Rails?
J'ai une instruction 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 J'ai pensé à rediriger vers un fichier - Si quelqu'un connaît une meilleure option, je suis à l'écoute.
Vous pouvez utiliser override $stdout
pour rediriger la sortie de la console:
$stdout = File.new('console.out', 'w')
Vous devrez peut-être également l'appeler une fois:
$stdout.sync = true
Cela redirigera toutes les sorties vers le fichier. Si vous souhaitez rediriger temporairement la sortie, assurez-vous de stocker la valeur d'origine de $stdout
afin que vous puissiez le modifier à nouveau.
Si vous recherchez une solution ponctuelle rapide, utilisez simplement les éléments suivants:
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
Outre la réponse de Veger, il existe une autre façon de le faire qui offre également de nombreuses autres options supplémentaires.
Ouvrez simplement votre répertoire de projet Rails et entrez la commande:
Rails c | tee output.txt
la commande tee propose également de nombreuses autres options que vous pouvez consulter en:
man tee
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 de
config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold)
Pour consigner uniquement les opérations liées aux enregistrements actifs, vous pouvez effectuer
ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt'))
Cela vous permet également d'avoir une configuration/un fichier d'enregistrement différent pour différents environnements.
En utilisant Hirb, vous pouvez choisir de consigner uniquement la sortie Hirb dans un fichier texte. Cela vous permet de voir toujours les commandes que vous tapez dans la fenêtre de la console, et seule la sortie du modèle ira dans le fichier.
D'après le Hirb readme :
Bien que les vues par défaut soient imprimées sur STDOUT, elles peuvent être facilement modifiées pour écrire n'importe où:
# 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
Utilisez hirb . Il envoie automatiquement en page toute sortie en irb qui est plus longue qu'un écran. Mettez ceci dans une session de console pour voir ce travail:
>> require 'rubygems'
>> require 'hirb'
>> Hirb.enable
Pour en savoir plus sur la façon dont cela fonctionne, lire cet article .
Essayez d'utiliser l'utilitaire script
si vous utilisez un système d'exploitation basé sur Unix.
script -c "Rails runner -e development lib/scripts/my_script.rb" report.txt
Cela m'a aidé à capturer facilement une très-très longue sortie d'un script runner Rails) dans un fichier.
J'ai essayé d'utiliser la redirection vers un fichier, mais il n'a été écrit qu'à la fin du script.
Cela ne m'a pas aidé car j'avais peu de commandes interactives dans mon script.
Ensuite, j'ai utilisé simplement script
, puis j'ai exécuté le Rails runner
en session de script mais il n'a pas tout écrit. Ensuite, j'ai trouvé ce script -c "runner command here" output_file
et il a enregistré toutes les sorties comme souhaité. C'était sur Ubuntu 14.04 LTS
Les références: