2009-04-19 15 views
6

में स्वचालित रूप से लॉगिंग अपवाद रूबी प्रोग्राम में फेंकने वाले अपवादों को पकड़ने और फ़ाइल में लॉग इन करने के लिए कोई लाइब्रेरी या आसान तरीका है? मैंने log4r और logger पर देखा है, लेकिन दोनों पर दस्तावेज़ इस बात पर कोई उदाहरण नहीं देते हैं कि मैं यह कैसे करूं। मैं इस कार्यक्रम को दूरस्थ रूप से चलाता हूं और stdout और stderr को हैंडल खो देता हूं, अगर वह जानकारी बिल्कुल मदद करती है।रुबी

आप क्या सलाह देंगे?

उत्तर

14

आप जंगली तरफ टहलने लेने के लिए चाहते हैं, इस प्रयास करें:

class Exception 
    alias real_init initialize 
    def initialize(*args) 
    real_init *args 
    # log the error (self) or its args here 
    end 
end 

इस निर्माण के समय नया अपवाद ऑब्जेक्ट के निर्माण रोकना होगा।

+1

धन्यवाद मार्कस! यदि जंगली पक्ष काम करता है, तो मैं इसे चलने के लिए तैयार हूं! –

+0

रचनात्मकता के लिए उभरा! –

+4

यह मजेदार है लेकिन मैं बंदरगाह अपवाद से बहुत सावधान रहूंगा ... –

4

Exception से बचाव।

begin 
    # run your code here .. 
rescue Exception => exception 
    # logger.error(...) .... 
    raise exception 
end 

यह अपवाद प्रवेश करेंगे, और यह फिर से उठाना ताकि आवेदन वास्तव में प्रवेश करने के अलावा एक त्रुटि को जन्म देती है: कुछ इस तरह शायद समझ में आता है।

exceptionException का एक उदाहरण है, एक नज़र the docs पर आप इस वस्तु के साथ क्या कर सकते हैं के बारे में जानकारी के लिए (जैसे पश्व-अनुरेखन तक पहुँचने के रूप में) ले लो।

+1

हम्म, यही वह है जो मुझे करने से डरता था। इसमें शामिल कोड मूल रूप से एक वर्ग है जिसमें कई विधियां हैं; क्या मुझे बस हर विधि पर प्रारंभ/बचाव करना होगा या क्या कोई आसान तरीका है? –

+0

आप शायद कहीं और उदाहरण बना रहे हैं - बचाव ब्लॉक डालें जहां आप उदाहरण बनाते हैं। –

+0

इंस्टेंस सृजन कोड पर इसे डालने तक कोई भी अच्छा काम नहीं करेगा जब तक कि त्रुटि सृजन में न हो। यदि आप किसी भी त्रुटि को पकड़ना चाहते हैं, तो वैश्विक स्तर पर, अपने मुख्य शरीर को लपेटें। – MarkusQ

2

यदि आप रेल ऐप चला रहे हैं, तो Exception Notification प्लगइन बहुत आसान है।

+0

आह हाँ, मैंने निश्चित रूप से इसे देखा है, लेकिन सवाल में मेरा ऐप रेल ऐप नहीं है। हालांकि धन्यवाद! –

0

यह काम करेगा अगर मैं कुछ इस तरह किया:

begin 
    main() 
rescue Exception => e 
    myCustomErrorLogger(e) 
end 

def main() 
    # All the application code comes here. 
end 

क्या मैं जरूरत है अपने सभी ध्यान में न आया अपवाद सबसे शीर्ष स्तर पर ले जाने के, और वहाँ पकड़ लिया और बाद में त्रुटि लॉगिंग द्वारा दर्ज किया है समारोह।

मैं अब यह कोशिश कर रहा हूं, लेकिन आपके सुझावों के लिए यह बहुत अच्छा होगा।

0

आप उस वर्ग में कक्षा अपवाद के कोड को ट्वीक कर सकते हैं जो कारण और बैकट्रैक को रोकता है।

यह जांचना न भूलें कि क्या लॉगर शून्य हो सकता है, अपवाद को इसके बनाए गए लॉगर (या जबकि) से पहले फेंक दिया जा सकता है।