रेल: एक अपवाद के पूरे स्टैक ट्रेस लॉगिंग


110

मैं एक स्टैक ट्रेस लॉग करने का सही तरीका जानने की कोशिश कर रहा हूं। मैं इस लिंक पर आया था जिसमें कहा गया था कि logger.error $ !, $-- backtrace जाने का रास्ता है लेकिन यह मेरे लिए काम नहीं करता है log_error करता है। दस्तावेज़ीकरण के अनुसार, मैं यह नहीं देखता कि त्रुटि विधि के लिए दूसरा तर्क कैसे पारित करना वैसे भी काम करेगा क्योंकि रेल लॉग का उपयोग करने वाला रूबी केवल एक तर्क को स्वीकार करता है।

अजीब तरह से (या शायद नहीं) किसी भी दुभाषिया की शिकायतों के बिना दूसरा तर्क स्वीकार किया जाता है। हालाँकि मैं इससे गुजरने वाली किसी भी चीज़ को नज़रअंदाज़ कर देता हूँ।

क्या कोई समझा सकता है कि मुझे क्या याद आ रहा है? किसी भी अंतर्दृष्टि में त्रुटि के लिए दूसरा तर्क क्या है और इसे क्या खा रहा है?

जवाबों:


204

यदि आप ActiveSupport में BufferedLogger वर्ग के लिए स्रोत को देखते हैं, तो आप देखेंगे कि दूसरा तर्क 'progname' है। इसका उपयोग केवल तब किया जाता है जब पहला तर्क शून्य होता है और आपने या तो इसे कोई ब्लॉक नहीं दिया है या ब्लॉक गैर-वास्तविक मान लौटाता है।

संक्षेप में, आप अतिरिक्त सामग्री के उत्पादन के लिए दूसरे पैरामीटर का उपयोग नहीं कर सकते।

आप जो करना चाहते हैं वह कुछ और है:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

आपके लॉगिंग सेटअप के आधार पर, बैकट्रेस की प्रत्येक पंक्ति के माध्यम से पुनरावृति करना और इसे अलग-अलग प्रिंट करना बेहतर हो सकता है क्योंकि कुछ लकड़हारे नए लिंक का उत्पादन नहीं करते हैं, जिस स्थिति में आप कुछ ऐसा करेंगे:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

5
क्रॉस-प्लेटफ़ॉर्म संगतता बनाए रखने के लिए मैं "\ r \ n" का उपयोग करूंगा।
जेम्स वाटकिंस

10
क्या आप $/इसके बजाय उपयोग नहीं करेंगे , क्रॉस-प्लेटफॉर्म संगत होने के लिए? बता दें कि रूबी ने इसका ध्यान रखा, क्योंकि \r\nयह केवल कुछ प्लेटफार्मों के लिए विशिष्ट है।
vgoff

12
आपको अपना संदेश विभाजित और अपठनीय मिल सकता है क्योंकि कई बार लकड़हारा को कॉल करना सुरक्षित नहीं है। जबकि लकड़हारा खुद धागा सुरक्षित है। आमतौर पर मैं अपने संदेश को एक स्ट्रिंग में शामिल करता हूं और फिर उसे लॉग करता हूं।
मोरोज़ोव

उस समय लकड़हारा लॉग प्रविष्टियों में नईलाइन्स का समर्थन नहीं करता था, इसलिए बंटवारा लेकिन हाँ, आप काफी सही हैं और आपको इस दृष्टिकोण की सीमाओं के बारे में पता होना चाहिए
Darkliquid

+1 @JackWatson बिल्कुल अजीब उत्तर है क्योंकि यह गैर-थ्रेड सुरक्षित है। यह महत्वपूर्ण बात है क्योंकि हम यहां वेब ऐप्स के बारे में बात कर रहे हैं
EvAlex

16

यह उत्तर है।

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
कम विराम चिह्न:Rails.logger.error [e.message, *e.backtrace].join($/)
Artm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.