Python 日志

import logging

# 记录器
# 处理器
# 格式化器
# 处理器绑定格式化
# 记录器绑定处理器
def log():
    logger = logging.getLogger('applog')
    # 如果记录器没有处理器就执行以下代码
    if not logger.hasHandlers():
        # 设置记录器的日志级别,记录器默认的级别是waring,如果不设置为debug,就算给处理器设置了日志级别为debug也不会生效
        logger.setLevel(logging.DEBUG)

        # 添加控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.DEBUG)

        # 添加文件处理器,默认是追加模式
        file_handler = logging.FileHandler('app.log','w')
        file_handler.setLevel(logging.INFO)

        #添加格式化器,-8s 向左对齐占8位
        formator = logging.Formatter('%(levelname)-8s %(asctime)s %(module)s %(lineno)d %(message)s',datefmt='%Y-%m-%d %H:%M:%S')

        #处理器绑定格式化器
        console_handler.setFormatter(formator)
        file_handler.setFormatter(formator)

        #记录器绑定处理器
        logger.addHandler(console_handler)
        logger.addHandler(file_handler)

        return logger


test = log()
test.debug('this is debug')
test.info('this is info')
test.warning('this is warning')
test.error('this is error')
test.critical('this is critical')

创建一个单实例模式的logger对象

import logging


class MyLog:
    __is_instance = None
    __is_flag = False
    __logger = None

    def __new__(cls, *args, **kwargs):
        if cls.__is_instance is None:
            cls.__is_instance = super().__new__(cls)
        return cls.__is_instance

    def __init__(self, file):
        if not MyLog.__is_flag:
            self.file = file
            # 创建记录器
            logger = logging.getLogger("my_log")
            logger.setLevel(logging.DEBUG)
            # 创建控制台处理器
            control_handler = logging.StreamHandler()
            # 创建文件记录器
            file_handler = logging.FileHandler(self.file, mode='w', encoding='utf-8')

            # 创建格式化器
            formatter = logging.Formatter('%(levelname)-8s %(filename)s %(funcName)s  %(asctime)s %(message)s',
                                          datefmt='%Y-%m-%d %H:%M:%S')
            # 处理器绑定格式化器
            control_handler.setFormatter(formatter)
            file_handler.setFormatter(formatter)

            # 记录器绑定处理器
            logger.addHandler(control_handler)
            logger.addHandler(file_handler)
            MyLog.__is_flag = True
            # 把logger赋值给类属性
            MyLog.__logger = logger

    # 通过属性的方式来访问
    @property
    def logger(self):
        return self.__logger


m = MyLog('../log/run.log')
n = MyLog('../log/run1.log') # 和上面的是同一个id
m.logger.info("aaa")
m.logger.info("bbb")
n.logger.info("ccc")
n.logger.debug("en")
n.logger.warning("en")

posted @ 2021-08-21 16:54  弩哥++  阅读(40)  评论(0编辑  收藏  举报