2013-02-11 28 views
7

Tôi đang sử dụng ruby ​​1.9.2p180 (2011-02-18 revision 30909)Ruby: Logger và Daemons

để thực hiện ghi nhật ký, tôi sử dụng đá quý khai thác gỗ. Chương trình của tôi có hai khối, được sử dụng làm daemon.

Nhưng đăng nhập từ các khối kết quả trong một lỗi và không có gì được ghi vào logfile:

log shifting failed. closed stream 
log writing failed. closed stream 

Đây là những gì xảy ra trong các mã:

log = Logger.new(logbase + 'logfile.log', 'monthly') 
log.level = Logger::INFO 

proc = Daemons.call(options) do 
    # [...] 
    log.info "Any Logmessage" 
    # [...] 
end 

Bất kỳ ý tưởng, whats sai đó?

Trả lời

8

Đá quý Daemons đóng tất cả các bộ mô tả tệp khi nó sao chép quy trình. Vì vậy, bất kỳ logfiles đã được mở trước khi khối Daemons sẽ được đóng lại trong quá trình chia hai.

Và vì bạn không thể ghi vào bộ mô tả tệp đã đóng -> lỗi.

Bạn có thể đọc thêm về những gì xảy ra khi bạn daemonize một quá trình bằng cách đọc các chương:

gì daemon nội làm với daemon của tôi?
http://daemons.rubyforge.org/Daemons.html

Giải pháp là mở nhật ký bên trong khối daemon thay vì bên ngoài khối. Điều đó sẽ khắc phục nó. Nhưng lưu ý rằng daemonizing thay đổi thư mục làm việc thành /, vì vậy hãy tính đến điều đó khi tham chiếu đường dẫn logfile.

+0

Điều đó đã giúp. Cảm ơn nhiều. – Dakkar

2

Một giải pháp hoạt động thành công trong đá quý delay_job bao gồm việc trích xuất tất cả các tệp đang mở trước ngã ba và mở lại chúng sau này.

Một chiết xuất điều chỉnh from delayed_job:

@files_to_reopen = [] 
ObjectSpace.each_object(File) do |file| 
    @files_to_reopen << file unless file.closed? 
end 

Daemons.run_proc('some_process') do 
    @files_to_reopen.each do |file| 
    file.reopen file.path, 'a+' 
    file.sync = true 
    end 

    # Your code 
end