2017-03-13 7 views
7

log.Lshortfile ध्वज का उपयोग कर, लकड़हारा उदाहरण के लिए, लकड़हारा समारोह कॉल का फ़ाइल नाम और लाइन नंबर वाले सभी लॉग लाइनों के प्रारंभिक भाग:क्या लॉग रैप करना संभव है। लाइन नंबर उपसर्ग को खोए बिना लॉगर फ़ंक्शन?

myfile.go:14: Hello, world!

अगर मैं इस तरह लॉग समारोह लपेटो, उदाहरण के लिए:

func info(pattern string, args ...interface{}) { 
    myLogger.Printf(pattern + "\n", args...) 
} 

इस फ़ंक्शन द्वारा उत्सर्जित प्रत्येक पंक्ति को Printf कॉल की लाइन संख्या के साथ प्रीफ़िक्स किया जा रहा है। यह अपेक्षित है, लेकिन वांछित व्यवहार प्रत्येक लाइन के लिए लाइन की लाइन संख्या के साथ prefixed किया जाना है जहां info कहा जाता है।

क्या इसके आसपास कोई रास्ता है?

उत्तर

6

तरीके उचित उत्पादन के लिए संदेश भेजने के लिए:

का संभावित हल log.Lshortfile झंडा हटाने और व्यवहार मैन्युअल लागू करने के लिए है। Logger.Output() आपको calldepth (छोड़ने के लिए फ्रेम की संख्या) पास करने की अनुमति देता है।

दुर्भाग्यवश log.Logger के तरीके calldepth "वायर्ड इन" होते हैं, इसलिए आप रैपर फ़ंक्शन के फ्रेम को छोड़ने के लिए ऑफ़सेट प्रदान नहीं कर सकते हैं।

लेकिन आपके रैपर से Logger.Output() पर कॉल करने का एक बेहतर विकल्प है, इसलिए आपको फ्रेम और लाइनों से परेशान करने की आवश्यकता नहीं है। यह भी ध्यान रखें कि आपको की एक नई लाइन जोड़ने की आवश्यकता नहीं है, क्योंकि log.Logger प्रकार पहले से ही ऐसा करता है कि अगर लॉग इन करने के लिए संदेश एक नई लाइन के साथ समाप्त नहीं होता है।

तो एक बेहतर और कम विकल्प:

var myLogger = log.New(os.Stdout, "[my]", log.Lshortfile) 

func info(pattern string, args ...interface{}) { 
    myLogger.Output(2, fmt.Sprintf(pattern, args...)) 
} 

परीक्षण यह:

func main() { 
    log.SetFlags(log.Lshortfile) 
    log.Println("hello") 
    info("world") 
} 

आउटपुट (Go Playground पर यह कोशिश):

main.go:11: hello 
[my]main.go:12: world 

आप देख सकते हैं, info()द्वारा मुद्रित लाइन नंबर की तुलना में उचित रेखा संख्या (+1 प्रिंट करता है पिछली लाइन में)।

+2

यही वह है जिसके बारे में मैं बात कर रहा हूं: डी ग्रेट उत्तर – Hubro

0

मैं इस प्रश्न में अपने वर्तमान कामकाज के रूप में शामिल करने जा रहा था, लेकिन मुझे लगता है कि यह एक वैध उत्तर है। मुझे आशा है कि कोई मुझे लॉगर कॉन्फ़िगरेशन विकल्प के बारे में बता सकता है जो मुझे याद आया है जो मुझे runtime.Caller पर कॉल करते समय लॉगर का उपयोग करने की गहराई को समायोजित करने देता है।

log.Logger कॉल Logger.Output() विधि के
func info(format string, args ...interface{}) { 
    _, file, line, _ := runtime.Caller(1) 

    prefix := fmt.Sprintf("%v:%v: ", path.Base(file), line) 

    if logger != nil { 
     logger.Printf(prefix+format+"\n", args...) 
    } 
} 
संबंधित मुद्दे