2011-12-18 5 views
5

Este script se llama o.rb:¿Por qué la salida de Logger a STDOUT no se redirige a los archivos?

@logger = Logger.new(STDOUT) 
@logger.info "start_time : #{start_time}" 

Cuando corro usando ./o.rb, la salida de la consola es correcta.
Sin embargo, cuando probé ./o.rb > log.txt 2>&1, ¡el archivo de registro está vacío!
¿Por qué sucedió esto?

Tengo el mismo problema al utilizar la función simple puts.


ACTUALIZACIÓN

Esto reproducir este problema:

require 'logger' 

logger = Logger.new(STDOUT) 

loop do 
    logger.info "This is a test haha" 
    sleep(1) 
end 

Cuando corro usando ./foo.rb, escribe correctamente a la salida de la consola.

Cuando ejecuto ./foo.rb > log.txt, no obtengo nada.

Además, cuando uso ./foo.rb | tee log.txt, no se escribe nada en la consola y el archivo de registro está vacío.

El archivo log.txt se creó pero permanece vacío.

Mi versión de Ruby es 1.8.7.

+0

funciona para mí ... Mi voluntad – sarnold

+0

programa mantiene funcionando tal vez por 1 día, es causada por los archivos de memoria intermedia no enrojecida? Justo ahora escribo un script simple que solo da salida a una oración y el programa sale, funciona. – nttstar

+0

No creo que sea buffering; ['LogDevice :: new'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new) calls [' @dev .sync = true'] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - que solicita una operación sin búfer. – sarnold

Respuesta

11

Es un problema de almacenamiento en búfer, puede establecer la salida estándar para sincronizar y esto debería resolverlo.

#!/usr/bin/env ruby 

require 'logger' 

$stdout.sync = true 
logger = Logger.new($stdout) 

loop do 
    logger.info "This is a test haha" 
    sleep 1 
end 
+0

funciona. pero ¿por qué la salida a la consola no tiene este problema (sin redirigir)? – nttstar

+1

No estoy seguro, Bash debe almacenar el descriptor de archivo cuando la salida estándar no es un tty. –

Cuestiones relacionadas