Стек вызовов доступен для формата регистрации - PullRequest
2 голосов
/ 17 марта 2011

Итак, у меня есть метод, который возвращает простую строку из стека вызовов.


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()

Что приводит к следующей записи:


monkey.foo.bar -- DEBUG: test

Ответы [ 3 ]

1 голос
/ 18 марта 2011

После вчерашнего исследования этого паттерна я понял, что то, что я хотел, не подходит для языка Python.В конце концов, это интерпретируемый язык, что означает, что всегда есть файл, который существует по известному пути, и номер строки, на который можно сослаться.Это будет иметь смысл в скомпилированном языке, таком как C #, Java, C или C ++, потому что у вас есть пространства имен, объекты и методы без преимущества наличия файла / пути и номера строки.

Мораль истории

Когда люди говорят вам, что то, что вы просите, не имеет смысла, не просто списывайте их со счетов.Потратьте несколько минут и внимательно изучите исходный запрос, а также энергично ищите ответ на вопрос, который может не иметь смысла в вашем конкретном сценарии использования или контексте.

1 голос
/ 15 июня 2016

Я попробовал ваше решение, смешанное с другим, оно дало мне результаты, которые я искал.

    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'
1 голос
/ 17 марта 2011

Возможно, самый простой способ - просто определить пользовательскую функцию debug:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...