• 升级优化关于日志生成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")
    

      

  • 相关阅读:
    [Linux/Apache Http]Apache Http(d)服务访问时报: 403 Forbidden You don't have permission to access /cdh/ on this server.
    [Linux]常用命令之【YUM】
    .Netcore HttpClient源码探究
    echarts使用多图的表达
    记录composer 安装 yii2项目
    IE浏览器js parseInt("08")返回值不是8
    将一个条件从else语句中拆分出来导致的bug
    我的第一次WebService接口开发教程
    Oracle以逗号分隔的字符串拆分为多行数据
    JS 小技巧
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/10629190.html
Copyright © 2020-2023  润新知