升级优化关于日志生成logging封装TimedRotatingFileHandler

1.变更升级:优化日志自定义输出到文件的level,以及文件夹生成用户自由控制

# coding=utf-8
import logging
import time
import os
import logging.handlers
import re

def logger(appName,rootstdout=True,handlerList=None):

    log_fmt= "%(asctime)s --%(name)s-- [%(levelname)s]:\n%(message)s"
    c_fmt="%(asctime)s --%(name)s-- %(filename)s.%(funcName)s():line %(lineno)d [%(levelname)s]:\n%(message)s"
    date_format = "%Y-%m-%d %H:%M:%S %a"
    # 设置控制台输出level
    logging.basicConfig(level=logging.DEBUG,
                            format=c_fmt,
                            datefmt=date_format,

                            )
    levels=[]
    if isinstance(handlerList,list):
        if handlerList.__contains__("I") or handlerList.__contains__("Info"):
            levels.append("Info")
        if handlerList.__contains__("D") or handlerList.__contains__("Debug"):
            levels.append("Debug")
        if handlerList.__contains__("E") or handlerList.__contains__("Error"):
            levels.append("Error")
        if handlerList.__contains__("W") or handlerList.__contains__("Warning"):
            levels.append("Warning")
        if levels:
                stamp = "dailylog.log"
                logsdir=os.path.join(os.getcwd(),"logs")
                if os.path.exists(logsdir):
                    for p in levels:
                        if os.path.exists(os.path.join(logsdir,p)):
                            pass
                        else:
                            os.mkdir(os.path.join(logsdir,p))
                else:
                    os.mkdir(logsdir)
                    for p in levels:
                         os.mkdir(os.path.join(logsdir,p))

                f_dict={}
                for i in levels:
                    filename=os.path.join(logsdir,i,stamp)
                    f_dict[i]=filename
                logger= logging.getLogger(appName)

                for k,v in f_dict.items():
                        handler=logging.handlers.TimedRotatingFileHandler(filename=v,when='MIDNIGHT', interval=1, backupCount=4)
                        handler.suffix = "%Y-%m-%d.log"
                        handler.extMatch = r"^\d{4}-\d{2}-\d{2}.log$"
                        handler.extMatch = re.compile(handler.extMatch)
                        h_fmt=logging.Formatter(log_fmt)
                        handler.setFormatter(h_fmt)
                        if k=="E" or k=="Error":
                            handler.setLevel(logging.ERROR)
                        elif k=="I" or k=="Info":
                            handler.setLevel(logging.INFO)
                        elif k== "W" or k=="Warning":
                             handler.setLevel(logging.WARNING)
                        elif k=="D" or k=="Debug":
                             handler.setLevel(logging.DEBUG)
                        else:
                            raise NameError("check your logLevel Name is corrected or not")
                        logger.addHandler(handler)
                logger.propagate = rootstdout
                return  logger
        else:
                raise TypeError("check handlerList at least one corrected logLevel in:'Error','Info','Warning','Debug'")
    else:
        raise NameError("handlerList expected type is list but get type {}".format(type(handlerList).__name__))
if __name__ == "__main__":
        logger=logger("root",rootstdout=True,handlerList=['E'])

        time.sleep(0.01)
        try:
            assert  1==2
        except Exception as e:
            logger.info("ddd",exc_info=True)

        logger.debug("bebug test")
        logger.error("error test")
        logger.warning("warning test")

  

原文地址:https://www.cnblogs.com/SunshineKimi/p/10629190.html