2011-12-18 31 views
5

Kịch bản này được đặt tên o.rb:Tại sao đầu ra Logger không được chuyển sang tệp STDOUT?

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

Khi tôi chạy nó bằng cách sử ./o.rb, sản lượng trên giao diện điều khiển là đúng.
Tuy nhiên, khi tôi thử ./o.rb > log.txt 2>&1, tệp nhật ký trống!
Tại sao điều này lại xảy ra?

Tôi gặp vấn đề tương tự khi sử dụng chức năng puts đơn giản.


CẬP NHẬT

này sẽ tạo lại vấn đề này:

require 'logger' 

logger = Logger.new(STDOUT) 

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

Khi tôi chạy nó bằng cách sử ./foo.rb, nó viết một cách chính xác để giao diện điều khiển đầu ra.

Khi tôi chạy ./foo.rb > log.txt, tôi không nhận được gì.

Ngoài ra, khi tôi sử dụng ./foo.rb | tee log.txt, không có gì được ghi vào bảng điều khiển và tệp nhật ký trống.

Tệp log.txt đã được tạo nhưng vẫn trống.

Phiên bản Ruby của tôi là 1.8.7.

+0

Làm việc cho tôi ... – sarnold

+0

Chương trình của tôi sẽ tiếp tục chạy trong một ngày, do bộ đệm tệp không bị xóa? Chỉ cần bây giờ tôi viết một kịch bản đơn giản mà chỉ xuất một câu và thoát khỏi chương trình, nó hoạt động. – nttstar

+0

Tôi không nghĩ rằng đó là bộ đệm; Các cuộc gọi ['LogDevice :: new'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new) [' @dev .sync = true'] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - yêu cầu thao tác không bị chặn. – sarnold

Trả lời

11

Đây là vấn đề về bộ đệm, bạn có thể đặt đầu ra tiêu chuẩn để đồng bộ hóa và điều này sẽ giải quyết vấn đề.

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

nó hoạt động. nhưng tại sao xuất ra bàn điều khiển không có vấn đề này (không chuyển hướng)? – nttstar

+1

Không chắc chắn, Bash phải đệm bộ mô tả tập tin khi đầu ra tiêu chuẩn không phải là một tty. –

Các vấn đề liên quan