2008-10-22 14 views
16

पर रीडायरेक्ट करें मैं डेमन्स मणि का उपयोग करके रुबी में एक डिमन बनाने पर काम कर रहा हूं। मैं डेमॉन से लॉग फ़ाइल में आउटपुट जोड़ना चाहता हूं। मैं सोच रहा हूं कि puts को कंसोल से लॉग फ़ाइल में रीडायरेक्ट करने का सबसे आसान तरीका क्या है।"put" कमांड आउटपुट को लॉग फ़ाइल

+0

उपयोग इस 'लकड़हारा || = Logger.new (" | टी # {settings.root} /log/migration_script_logger.log "," मासिक ")', इस – vs4vijay

उत्तर

13

मैं गहरे लाल रंग का लकड़हारा उपयोग करने के लिए, कहते हैं की तुलना में बेहतर है की सलाह देते हैं, तो आप एकाधिक लॉग स्तरों है कि आप पर/बंद कर सकते हैं हो सकता है: डिबग, चेतावनी दी है, जानकारी, त्रुटि, आदि

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

मैं रूबी सेवाओं का प्रबंधन करने RUNIT पैकेज का उपयोग, यह इच्छा से svlogd है लकड़हारा प्रक्रिया के लिए डेमॉन आउटपुट फ़ाइल लॉग इन करने के लिए, यहाँ चलाया जाता है स्क्रिप्ट अनुप्रेषित:

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

यह वास्तव में प्रश्न का उत्तर नहीं देता है। क्या होगा यदि आप यह नियंत्रित नहीं कर सकते कि _puts_ कौन कर रहा है और आप उन चीज़ों को कैप्चर करना चाहते हैं जो सामान्य रूप से STDOUT को लिखते हैं और उन्हें फ़ाइल में लिखते हैं? – silvamerica

11

पुनर्स्थापित करने के लिए

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

का प्रयास करें:

$stdout = STDOUT 
+2

दोनों करेगा यह मेरे लिए '$ stdout.sync = true' के बिना काम नहीं करेगा। –

34

तुम दोनों STDERR और STDOUT पर कब्जा करने की जरूरत है और प्रवेश का सहारा नहीं करना चाहते हैं, तो निम्न this post से अनुकूलित एक सरल उपाय है:

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

धन्यवाद, जिसने [इस] के साथ संयोजन में शक्तिशाली जुर्माना लगाया (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby) ! – TheDeadSerious

+0

'.sync' महत्वपूर्ण है। –

+2

क्या होगा यदि आप अभी भी टर्मिनल पर जाने के साथ-साथ फ़ाइल लॉग इन करना चाहते हैं? जैसे व्यवहार 'रूबी myscript.rb | tee my.log' – wim

0

या आप puts कमांड को फिर से परिभाषित कर सकते हैं? केवल एक एकल फाइल/कक्षा में शायद काम करता है

def puts(message) 
    #write message to file 
end 
संबंधित मुद्दे