2011-12-18 6 views
5

Questo script è chiamato o.rb:Perché l'output di Logger su STDOUT non viene reindirizzato ai file?

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

Quando eseguo usando ./o.rb, l'uscita sulla console è corretto.
Tuttavia, quando ho provato ./o.rb > log.txt 2>&1, il file di registro è vuoto!
Perché è successo?

Ho lo stesso problema durante l'utilizzo della semplice funzione puts.


UPDATE

Ciò riprodurre il problema:

require 'logger' 

logger = Logger.new(STDOUT) 

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

Quando eseguo usando ./foo.rb, si scrive correttamente l'output della console.

Quando corro ./foo.rb > log.txt, non ottengo nulla.

Inoltre, quando si utilizza ./foo.rb | tee log.txt, non viene scritto nulla sulla console e il file di registro è vuoto.

Il file log.txt è stato creato ma rimane vuoto.

La mia versione di Ruby è 1.8.7.

+0

Lavori per me ... – sarnold

+0

Il mio programma continuerà a essere in esecuzione forse per 1 giorno, è causato dai buffer dei file non svuotati? Proprio ora scrivo un semplice script che emette solo una frase e l'uscita del programma, funziona. – nttstar

+0

Non penso che funzioni nel buffer; ['LogDevice :: new'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new) chiama [' @dev .sync = true'] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - che richiede l'operazione unbuffered. – sarnold

risposta

11

È un problema di buffering, è possibile impostare l'output standard da sincronizzare e questo dovrebbe risolverlo.

#!/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

funziona. ma perché l'output in console non ha questo problema (senza reindirizzamento)? – nttstar

+1

Non sicuro, Bash deve bufferizzare il descrittore di file quando l'output standard non è un tty. –

Problemi correlati