2008-10-22 49 views
16

Tôi đang làm việc để tạo một daemon trong Ruby bằng cách sử dụng đá quý daemon. Tôi muốn thêm đầu ra từ daemon vào một tệp nhật ký. Tôi tự hỏi cách dễ nhất để chuyển hướng puts từ bàn điều khiển đến một tệp nhật ký là gì.Chuyển hướng đầu ra lệnh "đặt" vào tệp nhật ký

+0

Sử dụng này 'Logger || = Logger.new ("| tee # {} settings.root /log/migration_script_logger.log", "hàng tháng")', đây sẽ làm cả hai – vs4vijay

Trả lời

13

tôi nên khuyên bạn nên sử dụng ruby ​​logger, nó là tốt hơn so với puts, bạn có thể có nhiều cấp độ đăng nhập mà bạn có thể bật/tắt: gỡ lỗi, cảnh báo, thông tin, lỗi, v.v.

logger = Logger.new(STDOUT) 
logger = Logger.new("/var/log/my-daemon.log") 

Tôi sử dụng gói runit để quản lý dịch vụ Ruby, nó có svlogd hơn sẽ chuyển hướng đầu ra daemon để log file, ở đây là chạy kịch bản cho quá trình logger:

#!/bin/sh 
set -e 

LOG=/var/log/my-daemon 

test -d "$LOG" || mkdir -p -m2750 "$LOG" && chown nobody:adm "$LOG" 
exec chpst -unobody svlogd -tt "$LOG" 
+14

Điều này không thực sự trả lời câu hỏi. Điều gì sẽ xảy ra nếu bạn không thể kiểm soát ai đang thực hiện _puts_ và bạn muốn ghi lại những thứ thường ghi vào STDOUT và thay vào đó ghi chúng vào một tệp? – silvamerica

11

Hãy thử

$stdout = File.new('/tmp/output', 'w') 

Để khôi phục:

$stdout = STDOUT 
+2

Nó sẽ không làm việc cho tôi mà không có '$ stdout.sync = true'. –

34

Nếu bạn cần phải nắm bắt cả stderr và stdout và không muốn sử dụng đến khai thác gỗ, Sau đây là một giải pháp đơn giản chuyển thể từ this post:

$stdout.reopen("my.log", "w") 
$stdout.sync = true 
$stderr.reopen($stdout) 
+0

Cảm ơn, đã làm việc tốt đẹp kết hợp với [this] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby) ! – TheDeadSerious

+0

'.sync' là rất quan trọng. –

+2

nếu bạn muốn đặt vẫn vào terminal, cũng như để đăng nhập tập tin? ví dụ. hành vi như 'ruby myscript.rb | tee my.log' – wim

0

Hoặc bạn có thể xác định lại lệnh puts? Làm việc có lẽ chỉ trong một tập tin/lớp đơn

def puts(message) 
    #write message to file 
end 
Các vấn đề liên quan