rieles - Redirigir la salida de la consola a un archivo


81

En una consola bash, si hago esto:

cd mydir
ls -l > mydir.txt

El operador> captura la entrada estándar y la redirige a un archivo; así que obtengo la lista de archivos en mydir.txtlugar de en la salida estándar.

¿Hay alguna forma de hacer algo similar en la consola de rieles?

Tengo una declaración ruby ​​que genera muchas impresiones (~ 8k líneas) y me gustaría poder verla por completo, pero la consola solo "recuerda" las últimas 1024 líneas más o menos. Así que pensé en redirigir a un archivo: si alguien conoce una opción mejor, soy todo oídos.

Respuestas:


106

Puede usar la anulación $stdoutpara redirigir la salida de la consola:

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

Es posible que también deba llamar a esto una vez:

$stdout.sync = true

Esto redirigirá toda la salida al archivo. Si desea redirigir temporalmente la salida, asegúrese de almacenar el valor original de $stdoutpara poder volver a cambiarlo.


¡Gracias! Esto es exactamente lo que estaba buscando.
kikito

2
No funcionó para mí hasta que agregué $stdout.sync=true. Editado.
Peter DeWeese

2
$stdout.reopen("my.log", "w")parece ser una solución más elegante, vista en: stackoverflow.com/a/2480439/21217
dain

$stdout = File.new('console.out', 'w')tomando mucho tiempo. Estoy usando windows. ¡No estoy seguro si esa es la razón!
dhrubo_moy

138

Una solución rápida y única:

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

Crea un accesorio JSON:

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

Me dio NoMethodError: undefined method 'statements' for #<Blog:0x007fdaadbe4530>o undefined method 'statements' for #<ActiveRecord::Relation:0x007fdaaaf4f880>:(
Magne

5
¿Dónde se statements.xmlguarda el archivo en el sistema? No puedo encontrar el archivo.
SujitS

1
Esta es la mejor respuesta para mostrar cómo guardar un volcado de registro específico en lugar de decirle a alguien que agregue otra gema o complemento (TAN cansado de las recomendaciones de software cuando no es necesario) O volcar todo en la consola al archivo. Votado.
bshea

@SujitS: el archivo se guarda en el directorio desde el que ejecutó rails console(probablemente el directorio raíz de su aplicación). (Al menos este fue mi caso.)
user664833

13

Además de la respuesta de Veger, hay una o más formas de hacerlo que también proporciona muchas otras opciones adicionales.

Simplemente abra el directorio de su proyecto de rails e ingrese el comando:

rails c | tee output.txt

El comando tee también tiene muchas otras opciones que puede consultar mediante:

man tee

1
esto no funcionó para mí. Intenté ejecutar rails server | tee file.txty no hay salida para STDOUT o el archivo. Creo que el servidor no se inicia en este caso.
kapad

el servidor imprime a stderr, creo, debería haber opciones en el comando tee para redirigir eso también.
Kevin

Sí, haz algo como rails console 2>&1 | tee file.txt. No es una opción en tee, solo una simple redirección de stderr a stdout para que ambos terminen en su archivo.txt.
laberinto

El archivo terminó lleno de códigos de colores de la consola. Úselo pppara obtener resultados sin códigos de color.
Tim Abell

4

Si escribe el siguiente código en su archivo de entorno, debería funcionar.

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

También puede rotar el archivo de registro usando

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

Para registrar solo operaciones relacionadas con registros activos, puede hacer

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

Esto también le permite tener diferentes configuraciones / archivos de registrador para diferentes entornos.


Esto es útil, pero la otra respuesta hace lo que quería de una manera más simple. Gracias por tomarse el tiempo para responder de todos modos.
kikito

3

Con Hirb, puede optar por registrar solo la salida de Hirb en un archivo de texto. Eso le permite seguir viendo los comandos que escribe en la ventana de la consola, y solo la salida del modelo irá al archivo.

Del archivo Léame de Hirb :

Aunque las vistas se imprimen de forma predeterminada en STDOUT, se pueden modificar fácilmente para escribir en cualquier lugar:

# 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

Gracias por esto, ¡exactamente lo que estaba buscando!
sbonami

2

Utilice hirb . Pagina automáticamente cualquier salida en irb que sea más larga que una pantalla completa. Pon esto en una sesión de consola para ver este trabajo:

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

Para obtener más información sobre cómo funciona esto, lea esta publicación .


Gracias por responder, pero no buscaba paginación; Quería ver todo en una sola página.
kikito

2

Intente usar la scriptutilidad si está en un sistema operativo basado en Unix.

script -c "rails runner -e development lib/scripts/my_script.rb" report.txt

Eso me ayudó a capturar fácilmente el resultado muy largo de un script de ejecución de Rails en un archivo.

Intenté usar la redirección a un archivo, pero solo se escribió al final del script.

Eso no me ayudó porque tenía pocos comandos interactivos en mi script.

Luego utilicé solo scripty luego ejecuté la rails runnersesión de script en, pero no escribió todo. Luego encontré esto script -c "runner command here" output_filey guardé toda la salida como se deseaba. Esto fue en Ubuntu 14.04 LTS

Referencias:

/ubuntu/290322/how-to-get-and-copy-a-too-long-output-completely-in-terminal#comment1668695_715798

Escribir la salida de la consola Ruby en un archivo de texto

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.