2011-03-02 14 views
14

मैंने अपने आवेदन के लिए कस्टम लॉगर बनाया है, जिसे CRON_LOG कहा जाता है, बस कोड के इस टुकड़े को config/environment.rbलॉग संदेश से पहले वर्तमान समय जोड़ें

CRON_LOG = Logger.new("#{Rails.root}/log/cron.log") 
CRON_LOG.level = Logger::INFO 

पर जोड़कर और फिर, जब मैं कुछ लॉग करना चाहता हूं, तो बस ऐसा करें:

CRON_LOG.info "something" 

यह ठीक काम करता है, लेकिन मैं प्रत्येक लॉग संदेश से पहले वर्तमान टाइमस्टैम्प जोड़ना चाहता हूं। बेशक मैं अपने लॉग संदेश में सिर्फ Time.now जोड़ सकता हूं, लेकिन मैं जानना चाहता हूं कि प्रत्येक लॉग संदेश में इसे डिफ़ॉल्ट रूप से जोड़ने का कोई तरीका है या नहीं। मैं उसे कैसे कर सकता हूँ ?

धन्यवाद।

उत्तर

8

आप उचित विधि (जैसे environment.rb करने के लिए या एक प्रारंभकर्ता में निम्नलिखित जोड़ने) को फिर से परिभाषित कर सकते हैं:

class Logger 
    def format_message(severity, timestamp, progname, msg) 
    "#{timestamp} (#{$$}) #{msg}\n" 
    end 
end 

[सावधानी: इस दूसरे वालों को बाधित कर सकता; एक सुरक्षित समाधान के लिए स्टीफन जवाब देखने - JPH]

+0

बिल्कुल सही। धन्यवाद! – Brian

+2

अगर यह काम करता है तो इसे उत्तर के रूप में स्वीकार करें, इसलिए एक ही समस्या वाले अन्य लोग भविष्य में तुरंत इसे खोज लेंगे। :-) –

+0

मैंने इसे संभालने का एक कम आक्रामक तरीका जोड़ा है। किसी भी मामले में, यदि आप रनटाइम पर अन्य सक्रिय लॉगर्स के व्यवहार को संशोधित करने से बचने के लिए विधि को अधिभारित करने की योजना बनाते हैं, तो मैं उदाहरण पर 'लॉगर' को उप-वर्गीकरण या 'format_message' को फिर से परिभाषित करने की अनुशंसा करता हूं। – stephencelis

35

किसी syslog प्रारूपित लकड़हारा बनाने के लिए सबसे आसान तरीका है एक फ़ॉर्मेटर सीधे आवंटित करने के लिए है:

logger = Logger.new Rails.root.join('path', 'to', 'log') 
logger.formatter = Logger::Formatter.new 
logger.info 'Hello, world!' 
# Writes: 
# 
# I, [2011-06-02T20:02:34.579501 #15444] INFO -- : Hello, world! 
संबंधित मुद्दे