2011-03-17 6 views
1

따라서 호출 스택의 간단한 문자열을 반환하는 메서드가 있습니다.호출 스택을 로깅 형식으로 사용할 수 있습니다.


def call_stack(): 
    if "inspect" not in globals().keys(): 
     import inspect 
    stack = [frame[3] for frame in inspect.stack() if frame[3] not in [inspect.stack()[0][3],"<module>"]] 
    s = "" 
    for method in stack: 
     if len(s) > 0: 
      s += "." 
     s += method 
    return s 

def modify_logger(logger): 
    logger.args["call_stack"] = call_stack() 

이 동작을 만들 수 있습니까? 다음 항목 결과


import logging 
logging.basicConfig(level=logging.DEBUG, format="%(call_stack)s -- %(levelname)s: %(message)s") 

def bar(): 
    logging.debug("test") 

def foo(): 
    bar() 

def monkey(): 
    foo() 

# modify root logger. 
modify_logger(logging.getLogger()) 

# write to the log. 
monkey() 

:

import logging 

def call_stack(): 
    if "inspect" not in globals().keys(): 
     import inspect 
    stack = [frame[3] for frame in inspect.stack() 
      if frame[3] not in [inspect.stack()[0][3],"<module>"]] 
    s='.'.join(reversed(stack)) 
    return s 

def debug(message): 
    logging.debug('{s} -- DEBUG: {m}'.format(
     s=call_stack()[:-len('debug.')],m=message)) 

logging.basicConfig(level=logging.DEBUG, format="%(message)s") 

def bar(): 
    debug("test") 

def foo(): 
    bar() 

def monkey(): 
    foo() 

monkey() 

이 후

monkey.foo.bar -- DEBUG: test 

답변

0

아마도 가장 쉬운 방법은 사용자 정의 debug 함수를 정의하는 것입니다 다시 앉다 어제이 패턴을 아치 모양으로 만들었습니다. 필자가 원했던 것은 Python 언어에서는 합리적이지 않았습니다. 결국 해석 된 언어로, 알려진 경로에있는 파일과 참조 할 수있는 행 번호가 항상 있음을 의미합니다. 그것은 이 C#, Java, C 또는 C++와 같은 컴파일 된 언어에서 의미가 있습니다. 파일/경로 및 행 번호가 없어도 네임 스페이스, 객체 및 메서드가 있기 때문입니다. 사람들이 당신을 말할 때 이야기의

도덕은

당신이 이해가되지 않습니다 요구하는지, 단지 그들을 쓰지 않는다. 잠시 시간을내어 원래의 요청을 귀하의 관점과 함께 면밀히 검토 한 후에 특정 사례 - 사례 또는 상황에 맞지 않는 질문에 대한 답을 적극적으로 추구하십시오.

0

을 산출 :


monkey.foo.bar -- DEBUG: test 
0

당신의 솔루션을 다른 솔루션과 섞어 보았습니다. 내가 찾던 결과를 얻었습니다.

import logging 
    DEBUG = True 
    TRACE = True 

    #----------------------------------------------------------------------------- 
    # TRACE BACK 
    #----------------------------------------------------------------------------- 
    class ContextFilter(logging.Filter): 
     def filter(self, record): 
      import traceback 
      if "inspect" not in globals().keys(): 
       import inspect 
      stack = [frame[3] for frame in inspect.stack() 
      if frame[3] not in [inspect.stack()[0][3],"<module>"]] 
      record.stack ='.'.join(reversed(stack)) 
      return True 

    #-----------------------------------------------------------------------  --------- 
    # LOGGER 
    #-------------------------------------------------------------------------------- 
    logger = logging.getLogger() 
    if TRACE: 
     logger.addFilter(ContextFilter()) 

    if DEBUG: 
     logger.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(stack)s\n{%(pathname)s:%(lineno)d} - %(asctime)s - %(levelname)s - %(message)s') 

     fh = logging.FileHandler('log_filename.txt') 
     fh.setLevel(logging.DEBUG) 
     fh.setFormatter(formatter) 
     logger.addHandler(fh) 

     ch = logging.StreamHandler() 
     ch.setLevel(logging.DEBUG) 
     ch.setFormatter(formatter) 
     logger.addHandler(ch) 

    else: 
     logger.setLevel(logging.NOTSET) 
     print 'NOT IN DEBUG MODE: Logging.NOTSET' 
관련 문제