python - 当控制进入函数内部/外部时自动调试日志

标签 python logging python-logging

我正在尝试一个具有多种功能的项目。我正在使用标准 logging 模块 要求是记录 DEBUG 日志,其中显示:

<timestamp> DEBUG entered foo() 
<timestamp> DEBUG exited foo()
<timestamp> DEBUG entered bar()
<timestamp> DEBUG exited bar()

但我不想在每个函数中写入调试日志。 Python 中有没有一种方法可以处理包含函数进入和退出的自动日志?

我不想对所有函数使用任何装饰器,除非它是 Python 中唯一的解决方案。

最佳答案

你有什么理由不想使用装饰器吗?这很简单:

from functools import wraps
import logging

logging.basicConfig(filename='some_logfile.log', level=logging.DEBUG)

def tracelog(func):

    @wraps(func) # to preserve docstring
    def inner(*args, **kwargs):
        logging.debug('entered {0}, called with args={1}, kwargs={2}'.format(func.func_name, *args, **kwargs))
        func(*args, **kwargs)
        logging.debug('exited {0}'.format(func.func_name))

    return inner

如果你明白了,那么传入一个独立的记录器只是另一层深度:

def tracelog(log):

    def real_decorator(func):
        @wraps(func)
        def inner(*args, **kwargs):
            log.debug('entered {0} called with args={1}, kwargs={2}'.format(func.func_name, *args, **kwargs))
            func(*args, **kwargs)
            log.debug('exited {0}'.format(func.func_name))
        return inner
    return real_decorator

很酷的事情是,这适用于函数和方法

使用示例:

@tracelog(logger)
def somefunc():
    print('running somefunc')

关于python - 当控制进入函数内部/外部时自动调试日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715448/

相关文章:

Python traceback,显示错误发生的行,即使没有显示完整的 traceback

python - 如何用最常见的值替换 pandas 列的值

Python SysLogHandler 不工作 : socket. 错误 'Connection refused'

python - pytest 有没有办法检查是否在错误级别或更高级别创建了日志条目?

python - Hook 生成器函数的最佳方法(如果有)

Python:使用列表值添加到字典的最佳方式

C++ - 可变参数函数和 cout

java - 从 log4j1 迁移到 log4j2

django - 有什么方法可以将当前日志记录修改为 json 格式,并添加了一些其他字段 python 日志记录

Pythonlogging setLevel 整数输入是什么意思?