web-dev-qa-db-fra.com

rails - Rediriger la sortie de la console vers un fichier

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.

76
kikito

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.

92
Veger

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
126
Minimul

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
10
Chandra Agarwala

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.

4
Chirantan

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
3
Magne

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 .

2
cldwalker

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:

https://askubuntu.com/questions/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

Écriture Ruby Sortie de la console dans un fichier texte

1
Jignesh Gohel