Python使用logging模块实现日志记录实例

logging模块简介

logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。
logging模块提供了两种记录日志的方式:

1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,logging.info…)
2)使用logging模块的组件(loggers,handlers,filters,formatters)

Python logging日志级别

表 1 Python logging日志级别
级别 对应的函数 描述
DEBUG logging.debug() 最低级别,用于小细节,通常只有在诊断问题时,才会关心这些消息。
INFO  logging.info() 用于记录程序中一般事件的信息,或确认一切工作正常。
WARNING  logging.warning() 用于表示可能的问题,它不会阻止程序的工作,但将来可能会。
ERROR  logging.error() 用于记录错误,它导致程序做某事失败。
CRITICAL logging.critical() 最高级别,用于表示致命的错误,它导致或将要导致程序完全停止工作。

实例

import logging
from logging.handlers import TimedRotatingFileHandler

class RecordLogs:
    def __init__(self, log_name, level=20, log_format="%(asctime)s,%(msecs)d %(name)s:%(levelname)s: [%(module)s(%(lineno)d)] %(message)s",
                date_format="%Y-%m-%d %H:%M:%S", console_print=True, log_file=None, when=None):
        self.log_name = log_name
        self.level = level
        self.log_format = log_format
        self.date_format = date_format
        self.console_print = console_print
        self.log_file = log_file
        self.when = when

    def print(self):
        # avoid duplicate printing
        if not self.console_print and not self.log_file:
            print("Error: Save log in file, but input not log file!")
            return
        log_dict = logging.Logger.manager.loggerDict
        print_flag = True if self.log_name not in log_dict else False
        when = None if self.when not in ["S", "M", "H", "D", "midnight"] else self.when
        if not print_flag:
            return
        # create logger
        logger = logging.getLogger(self.log_name)
        logger.setLevel(self.level)
        formatter = logging.Formatter(self.log_format, self.date_format)

        if self.console_print:
            # create handler,output log to console
            log_sh = logging.StreamHandler()
            log_sh.setFormatter(formatter)
            # logger add handler
            logger.addHandler(log_sh)
        if self.log_file:
            if when:
                logHandler = TimedRotatingFileHandler(self.log_file, when=when)
                logHandler.setFormatter(formatter)
                logger.addHandler(logHandler)
            else:
                fh = logging.FileHandler(self.log_file)
                fh.setFormatter(formatter)
                # logger add handler
                logger.addHandler(fh)
        return logger

if __name__ == "__main__":
    import time
    test_log = RecordLogs("log_test", console_print=True, log_file="C:/Users/user/Desktop/test.log", when=None, level=10).print()
    while True:
        test_log.info("info logger")
        test_log.error("error logger")
        test_log.warning("warning logger")
        test_log.debug("debug logger")
        time.sleep(10)
结果:

在这里插入图片描述

总结:

通过该模块针对程序运行过程中打印的日志,尤其是记录错误的信息,对排错至关重要,不然每次都得手动执行程序再次复现,非常的麻烦!

猜你喜欢

转载自blog.csdn.net/Lin_Hv/article/details/107663564