2011-03-31 16 views
10

मेरा विचार के रूप में नीचे दिए गए उदाहरण पर दिखाया संदर्भ लॉगिंग योजना बनाने के लिए है:, हाथअजगर खरोज संदर्भ स्तर लॉग इन करने के उपसर्ग लंबाई

[ DEBUG] Parsing dialogs files 
[ DEBUG] ... [DialogGroup_001] 
[ DEBUG] ...... Indexing dialog xml file [c:\001_dlg.xml] 
[ DEBUG] ......... dialog [LobbyA] 
[ DEBUG] ............ speech nodes [3] 
[ DEBUG] ............... [LobbyA_01] 
[ DEBUG] ............... [LobbyA_02] 
[ DEBUG] ............... [LobbyA_03] 
[ DEBUG] ............ sms nodes [0] 
[ DEBUG] ......... dialog [LobbyB] 
[ DEBUG] ............ speech nodes [3] 
[ DEBUG] ............... [LobbyB_01] 
[ DEBUG] ............... [LobbyB_02] 
[ DEBUG] ............... [LobbyB_03] 
[ DEBUG] ............ sms nodes [0] 
[ DEBUG] ... [DialogGroup_002] 
[ DEBUG] ...... Indexing dialog xml file [c:\002_dlg.xml] 
[ DEBUG] ......... dialog [HighGroundsA] 
[ DEBUG] ............ speech nodes [3] 
[ DEBUG] ............... [HighGroundsA_01] 
[ DEBUG] ............... [HighGroundsA_02] 
[ DEBUG] ............... [HighGroundsA_03] 
[ DEBUG] ............ sms nodes [0] 

इस बिंदु पर, मैं कस्टम के साथ एक अजगर की लॉगिंग मॉड्यूल का उपयोग कर रहा -written उपसर्गों जब प्रवेश करने, उदाहरण के लिए:

(...) 

log.debug('') 
log.debug('Parsing dialogs files') 
for dlg in defDlgList: 
    log.debug('... [{0}]'.format(dlg)) 

(...) 

यह काफी ठीक काम कर रहा है, लेकिन कुछ सूक्ष्म समस्याओं उदाहरण के लिए, देखते हैं: जब अंदर कार्यों से प्रवेश करने - वे विभिन्न कार्यक्षेत्रों और उपसर्ग लंबाई के लिए भिन्न हो सकते हैं से कहा जा सकता है प्रत्येक कॉल

मैं प्रत्येक लॉग के लिए स्वचालित रूप से '...' उपसर्ग की लंबाई स्थापित करने के लिए एक सुरुचिपूर्ण और अदृश्य तरीका ढूंढ रहा हूं। मैं नहीं बल्कि प्रत्येक समारोह के लिए एक पैरामीटर के रूप उपसर्ग लंबाई गुजर या स्पष्ट कॉल का उपयोग लंबाई की स्थापना उदाहरण के लिए, से बचने चाहते हैं:

(...) 

logWrapper.debug('') 
logWrapper.debug('Parsing dialogs files') 
for dlg in defDlgList: 
    logWrapper.nextLogLevelBegin() 
    logWrapper.debug('[{0}]'.format(dlg)) 
    logWrapper.nextLogLevelEnd() 

(...) 

वहाँ एक रास्ता पायथन के पार्सर से वर्तमान खरोज स्तर मिलता है या एक गुंजाइश संवेदनशील के निर्माण के लिए है लॉगिंग के लिए रैपर वर्ग?

उत्तर

11

शायद आप inspect.getouterframes उपयोग कर सकते हैं खरोज स्तर को खोजने के लिए:

import inspect 
import logging 

logger=logging.getLogger(__name__) 

def debug(msg): 
    frame,filename,line_number,function_name,lines,index=inspect.getouterframes(
     inspect.currentframe())[1] 
    line=lines[0] 
    indentation_level=line.find(line.lstrip()) 
    logger.debug('{i} [{m}]'.format(
     i='.'*indentation_level, 
     m=msg    
     )) 

def foo():  
    debug('Hi Mom') 
    for i in range(1): 
     debug("Now we're cookin") 

if __name__=='__main__': 
    logging.basicConfig(level=logging.DEBUG) 
    foo() 

उपज

DEBUG:__main__:.... [Hi Mom] 
DEBUG:__main__:........ [Now we're cookin] 
+0

यही मुझे जानने की जरूरत है! : डी: डी: डी: डी बहुत बहुत धन्यवाद! – Helbreder

8

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

len(traceback.extract_stack()); 

उदाहरण:

import traceback; 

def test(): 
    print len(traceback.extract_stack()); 

print len(traceback.extract_stack()); # prints 1 
test(); # prints 2 
+0

यह उपयोगी है, धन्यवाद! मैं इसे नेस्टेड फ़ंक्शंस लॉग को सही बनाने के लिए चुनिंदा उत्तर से समाधान के साथ जोड़ दूंगा। – Helbreder

3

How do I add custom field to Python log format string? के साथ पिछले उत्तरों को जोड़कर एक कस्टम परिणाम डीबग() विधि प्रदान करने के बिना एक ही परिणाम प्राप्त कर सकता है (क्योंकि प्रत्येक स्तर की जानकारी(), त्रुटि(), आदि के लिए इसे करने की आवश्यकता होगी)।

import logging 
import traceback 
class CustomAdapter(logging.LoggerAdapter): 
    @staticmethod 
    def indent(): 
     indentation_level = len(traceback.extract_stack()) 
     return indentation_level-4 # Remove logging infrastructure frames 

    def process(self, msg, kwargs): 
     return '{i}{m}'.format(i='\t'*self.indent(), m=msg), kwargs 

logger = CustomAdapter(logger, {}) 
logger.debug('A debug message') 
logger.error('An error message') 
logger.info('An info message') 
संबंधित मुद्दे