2014-07-17 5 views
58

मैं भी लाइन जहां log.Fatal भाग गया था प्रिंट नहीं करता log.Fatal के साथ मेरी Golang कार्यक्रम में त्रुटियों फेंक करने की कोशिश कर रहा था लेकिन, log.Fatal। क्या लाइन नंबर तक पहुंच प्राप्त करने का कोई तरीका नहीं है जिसे लॉग कहा जाता है। घातक? यानी त्रुटि फेंकते समय लाइन नंबर प्राप्त करने का कोई तरीका है?आपको गोलांग प्रोग्राम को त्रुटि के लाइन नंबर को मुद्रित करने के लिए कैसे मिलता है जिसे इसे अभी कहा जाता है?

मैं इस गूगल की कोशिश कर रहा है, लेकिन अनिश्चित कैसे किया गया था। सबसे अच्छी चीज जो मुझे मिल सकती थी वह printing the stack trace थी, जो मुझे लगता है कि अच्छा है लेकिन थोड़ा अधिक हो सकता है। मैं भी debug.PrintStack() हर बार जब मैं लाइन नंबर की आवश्यकता लिखने के लिए नहीं करना चाहते हैं, मैं सिर्फ इस तरह log.FatalStackTrace() या कुछ है कि पोशाक नहीं है के लिए समारोह में किसी भी निर्माण किया वहाँ नहीं है हैरान हूं।

इसके अलावा, कारण मैं अपने खुद के डिबगिंग/त्रुटि हैंडलिंग सामान बनाने के लिए नहीं करना चाहती है, क्योंकि मैं नहीं चाहता लोगों को कैसे अपने विशेष पोशाक हैंडलिंग कोड का उपयोग करने में जानने के लिए है। मैं तो बस कुछ मानक जहां लोगों को मेरी कोड बाद में पढ़ सकते हैं और हो सकता है कम लोग मेरे कोड के बारे में बेहतर :)

+0

http://golang.org/src/pkg/log/log.go?s=4418:4472# देखना L120 – chendesheng

+0

जिस पल में आप लाइन नंबर प्रिंट कर रहे हैं इसका मतलब है कि मुझे आपके कोड में गोता लगाने की ज़रूरत है, इसलिए "कम लोगों को मेरे कोड के बारे में बेहतर सीखना होगा" यहां मूक है। आपको क्या करना चाहिए स्पष्ट और संक्षिप्त त्रुटियां हैं। – Wessie

उत्तर

69

आप या तो एक कस्टम लॉगर, या डिफ़ॉल्ट पर झंडे सेट कर सकते हैं शामिल करने के लिए Llongfile or Lshortfile

// to change the flags on the default logger 
log.SetFlags(log.LstdFlags | log.Lshortfile) 
+0

तो, यह काम करने के लिए मैं केवल स्थापित करने के लिए है कि पैकेज फ़ाइलों में से एक के शीर्ष पर की जरूरत है और यह है कि पैकेज के लिए अपने सभी फ़ाइलों के लिए उपलब्ध होगी? – Pinocchio

+3

हाँ, आप एक कस्टम उपयोग कर रहे हैं लोग इन आप 'वर mylog = log.New की तरह उपयोग कर सकते हैं (os.Stderr," ऐप्स: ", log.LstdFlags | log.Lshortfile)'। – OneOfOne

+0

क्या मुझे वास्तव में एक चर बनाना है? मैं सिर्फ लॉग नहीं कर सकता। SetFlags (log.LstdFlags | log.Lshortfile) मेरी जाने फ़ाइल के शीर्ष पर? मुझे एक त्रुटि मिलती है: 'अपेक्षित घोषणा,' इंडेंट 'लॉग' मिला जब मैं 'लॉग' करने की कोशिश करता हूं। लॉगफ्लैग (लॉग.एलटीडीएफएलएजी | लॉग.शॉर्टफाइल) '। यह सिर्फ मुझे इसके लिए एक चर बनाने के लिए परेशान करता है, क्यों नहीं 'लॉग। घातक ("स्ट्रिंग", लॉग.फ्लैग) '। लेकिन एक नया चर लॉग बनाने काम किया। क्या यह लॉग चर और सामान बनाने के लिए एक मानक बात है? – Pinocchio

51

लघु संस्करण जानने के लिए

तरह

"ah ok, so its throwing an error and doing X..."

कर सकते हैं, कुछ भी नहीं सीधे में बनाया गया है, लेकिन आप इसे का उपयोग कर एक न्यूनतम सीखने की अवस्था के साथ लागू कर सकते हैं runtime.Caller

func HandleError(err error) (b bool) { 
    if err != nil { 
     // notice that we're using 1, so it will actually log where 
     // the error happened, 0 = this function, we don't want that. 
     _, fn, line, _ := runtime.Caller(1) 
     log.Printf("[error] %s:%d %v", fn, line, err) 
     b = true 
    } 
    return 
} 

//this logs the function name as well. 
func FancyHandleError(err error) (b bool) { 
    if err != nil { 
     // notice that we're using 1, so it will actually log the where 
     // the error happened, 0 = this function, we don't want that. 
     pc, fn, line, _ := runtime.Caller(1) 

     log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err) 
     b = true 
    } 
    return 
} 

func main() { 
    if FancyHandleError(fmt.Errorf("it's the end of the world")) { 
     log.Print("stuff") 
    } 
} 

playground

+2

जबकि पहले से दिया गया जवाब अच्छी तरह से समस्या को हल करता है, आपके समाधान ने मुझे कुछ भयानक अस्तित्व के लिए चेतावनी दी - रनटाइम पैकेज! लवली सामान :) https://golang.org/pkg/runtime/ –

संबंधित मुद्दे

 संबंधित मुद्दे