python logger日志模块封装--避免日志重复打印

1、format常用格式说明
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID

2.具体代码如下:

  

import logging
from logging import handlers
import os

class LoggerBasic(object):

    @classmethod
    def logger_basic(cls):
        logger = logging.getLogger(__name__)
        # 设置输出的等级
        LEVELS = {'NOSET': logging.NOTSET,
                  'DEBUG': logging.DEBUG,
                  'INFO': logging.INFO,
                  'WARNING': logging.WARNING,
                  'ERROR': logging.ERROR,
                  'CRITICAL': logging.CRITICAL}
        # 创建文件目录
        logs_dir = f"{os.path.dirname(os.path.dirname(__file__))}/log"
        file_name = 'ApiTestLogs'
        if os.path.exists(logs_dir) and os.path.isdir(logs_dir):
            pass
        else:
            os.mkdir(logs_dir)
        # 修改log保存位置
        # timestamp = time.strftime("%Y-%m-%d", time.localtime())
        logfilename = f'{file_name}.log'
        logfilepath = os.path.join(logs_dir, logfilename)
        # rotatingFileHandler = logging.handlers.RotatingFileHandler(filename=logfilepath,
        #                                                            maxBytes=1024 * 1024 * 50,
        #                                                            backupCount=5)
        rotatingFileHandler = logging.handlers.TimedRotatingFileHandler(filename=logfilepath,
                                                                        when='D',
                                                                        interval=30,
                                                                        encoding='utf-8')  # 按照时间进行切割.

        # 设置输出格式
        formatter = logging.Formatter('%(asctime)s -%(filename)s -%(levelname)s[line:%(lineno)d]: -%(message)s',
                                      '%Y-%m-%d %H:%M:%S %p')
        rotatingFileHandler.setFormatter(formatter)
       #加这一行if判断最为重要,如果不加的话,会重复打印日志
        if not logger.handlers:
            # 控制台句柄
            console = logging.StreamHandler()
            console.setLevel(logging.NOTSET)
            console.setFormatter(formatter)
            # 添加内容到日志句柄中
            logger.addHandler(rotatingFileHandler)
            logger.addHandler(console)
            logger.setLevel(LEVELS['INFO'])


        return logger

解决日志重复打印来自于:https://www.cnblogs.com/kisun168/p/11912131.html

原文地址:https://www.cnblogs.com/zhuxibo/p/13952707.html