2011-01-14 13 views
8

में स्रोत कोड लाइनों को मुद्रित करने के लिए क्या प्रोग्रामिंग में पाइथन लॉगर रिपोर्ट में स्रोत कोड लाइनों को शामिल करने के लिए कुछ अपेक्षाकृत सरल तरीका है। उदाहरण के लिए ...पायथन लॉगर

import logging 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     logging.debug('some way to get previous line of source code here?') 

ताकि आउटपुट इस तरह दिखेगा।

example.py: DEBUG: main(): 14:  if something_is_not_right == True: 
+0

doesn ' टी जो पहले से ही ऐसा करता है? – marcog

+0

@marcog मेरी समस्या को और स्पष्ट रूप से समझाने में असमर्थता के लिए खेद है। TryPyPy और unutbu समझ में आया कि मैं क्या देख रहा था। उम्मीद है कि उनके जवाब बताएंगे कि मैं क्या कर रहा था। – ojs

+0

मैंने भी मार्कक के समान धारणा बनाई और समस्या को समझ में नहीं आया। शायद अपने प्रश्न को पढ़ने के लिए संपादित करें "प्रोग्रामेटिक रूप से _arbitrary_ स्रोत कोड लाइनों को शामिल करें, न केवल उस पंक्ति को जो लॉग करता है" –

उत्तर

12
import inspect 
import logging 
import linecache 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right: 
     logging.debug(linecache.getline(
      __file__, 
      inspect.getlineno(inspect.currentframe())-1)) 

if __name__=='__main__': 
    main() 

पैदावार

test.py: DEBUG: main(): 18:  if something_is_not_right == True: 
+0

वाह, यह सरल ____file____ और ____line____ के लिए रो रहा है (बिना किसी निरीक्षण/वर्तमान फ्रेम सामग्री के)। – jarmod

+0

मुझसे +1 - कभी भी 'लाइन कैश' के बारे में नहीं जानता था। –

4

सिर्फ इसलिए कि मैं unutbu कुछ इसी तरह की कोशिश देखा था, यहाँ कोड मैं के साथ आया है (पोस्ट करने के लिए बहुत देर हो चुकी अन्यथा):

import logging, sys 

# From logging.py 
def currentframe(): 
    """Return the frame object for the caller's stack frame.""" 
    try: 
     raise Exception 
    except: 
     return sys.exc_traceback 

f = open(__file__.rstrip('c')) 
owncode = f.readlines() 
f.close() 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: ' 
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     prev = owncode[currentframe().tb_frame.f_back.f_lineno - 2] 
     logging.debug('previous line of source code here:\n%s' % prev) 

if __name__ == '__main__': 
    main() 
संबंधित मुद्दे