python 在 logging.debug() 之后如何查看其日志记录

python after logging.debug() how to view its logrecord

最近我遇到登录 python。

我在 test.py 文件中有以下代码

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
logger.debug("test Message")

现在,有什么方法可以打印 logger.debug("test Message") 生成的结果 Logrecord 对象,因为文档中说明

LogRecord instances are created automatically by the Logger every time something is logged

https://docs.python.org/3/library/logging.html#logrecord-objects

我检查了将 debug 保存到变量中并打印它

test = logger.debug("test Message")
print(test)

输出是NONE

我的目标是check/view使用print()在同一个test.py中logging.debug(test.py)生成的最终Logrecord对象,这是我自己的理解。

print(LogrecordObject.__dict__)

那么如何获取由logger.debug("test Message")

生成的Logrecord对象

debug()中没有return

# Here is the snippet for the source code
    def debug(self, msg, *args, **kwargs):
        if self.isEnabledFor(DEBUG):
            self._log(DEBUG, msg, args, **kwargs)

如果你想得到LogRecordreturn,你需要重新定义一个debug(),你可以这样覆盖:

import logging

DEBUG_LEVELV_NUM = 9 
logging.addLevelName(DEBUG_LEVELV_NUM, "MY_DEBUG")

def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
    sinfo = None
    fn, lno, func = "(unknown file)", 0, "(unknown function)"
    if exc_info:
        if isinstance(exc_info, BaseException):
            exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
        elif not isinstance(exc_info, tuple):
            exc_info = sys.exc_info()
    record = self.makeRecord(self.name, level, fn, lno, msg, args,
                             exc_info, func, extra, sinfo)
    self.handle(record)
    return record


def my_debug(self, message, *args, **kws):
    if self.isEnabledFor(DEBUG_LEVELV_NUM):
        # Yes, logger takes its '*args' as 'args'.
        record = self._log(DEBUG_LEVELV_NUM, message, args, **kws)
        return record

logger = logging.getLogger(__name__)
logging.Logger.my_debug = my_debug
logging.Logger._log = _log
logger.setLevel(DEBUG_LEVELV_NUM)
logger.addHandler(logging.StreamHandler())
test = logger.my_debug('test custom debug')
print(test)

参考: How to add a custom loglevel to Python's logging facility

您可以创建一个处理程序,而不是将 LogRecord 实例格式化为字符串,只需将其保存在列表中以便稍后查看和检查:

import logging
import sys


# A new handler to store "raw" LogRecords instances
class RecordsListHandler(logging.Handler):
    """
    A handler class which stores LogRecord entries in a list
    """
    def __init__(self, records_list):
        """
        Initiate the handler
        :param records_list: a list to store the LogRecords entries
        """
        self.records_list = records_list
        super().__init__()

    def emit(self, record):
        self.records_list.append(record)


# A list to store the "raw" LogRecord instances
logs_list = []

# Your logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Add the regular stream handler to print logs to the console, if you like
logger.addHandler(logging.StreamHandler(sys.stdout))

# Add the RecordsListHandler to store the log records objects
logger.addHandler(RecordsListHandler(logs_list))


if __name__ == '__main__':

    logger.debug("test Message")
    print(logs_list)

输出:

test Message
[<LogRecord: __main__, 10, C:/Automation/Exercises/222.py, 36, "test Message">]