简体   繁体   English

python logging.debug()之后如何查看它的logrecord

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

Recently I came across logging in python.最近我遇到了登录python。

I have the following code in test.py file我在 test.py 文件中有以下代码

import logging

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

Now, is there any way I can print the resulting Logrecord object generated by logger.debug("test Message") because it's stated in the documentation that现在,有什么方法可以打印由Logrecord logger.debug("test Message")生成的结果Logrecord对象,因为它在文档中说明

LogRecord instances are created automatically by the Logger every time something is logged每次记录某些内容时,Logger 都会自动创建 LogRecord 实例

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

I checked saving debug into a variable and print it我检查了将debug保存到变量中并打印它

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

the output is NONE输出为NONE

My goal is to check/view the final Logrecord object generated by logging.debug(test.py) in the same test.py by using print() This is for my own understanding.我的目标是通过使用print()在同一个 test.py 中检查/查看由logging.debug(test.py)生成的最终 Logrecord 对象这是我自己的理解。

print(LogrecordObject.__dict__)

So how to get hold of the Logrecord object generated by logger.debug("test Message")那么如何获取Logrecord logger.debug("test Message")生成的Logrecord对象

There is no return in debug() 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)

If you wanna get LogRecord return, you need to redefine a debug() , you can overwrite like this:如果你想得到 LogRecord 返回,你需要重新定义一个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)

Reference: How to add a custom loglevel to Python's logging facility参考: 如何向 Python 的日志记录工具添加自定义日志级别

You can create a handler that instead of formatting the LogRecord instance to a string, just save it in a list to be viewed and inspected later:您可以创建一个处理程序,而不是将 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)

Output:输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM