• Python之logging模块


    logging模块是Python自带的,不是内置的模块。

    logging分为五个日志级别:

      1.DEBUG = 10(调试级别)

      2.INFO = 20(消息,正常运行级别)

      3.WARNING = 30(警告级别)

      4.ERROR = 40(错误,可能有错误级别)

      5.CRITICAL = 50(严重,程序面临崩溃)

      默认日志级别为WARNING,默认提示信息显示在屏幕

    import logging
    logging.basicConfig(filename='access.log',
                        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',
                        level=20
                        )
    
    logging.debug('调试debug')
    logging.info('消息info')
    logging.warning('警告warn')
    logging.error('错误error')
    logging.critical('严重critical')

    logging模块指定全局配置

    logging.basicConfig()函数中的可用参数有:
    filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
    
    
    format参数中可能用到的格式化串:
    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s用户输出的消息

    logging对象

      1.logger:负责造日志

      2.filter:过滤日志

      3.handler:控制日志打印到文件或在终端显示

      4.formatter:控制日志格式

    import logging
    
    #log对象:负责造日志,交给filter过滤,然后交给不同的handler输出
    log1=logging.getLogger(__file__)
    
    #handler对象接受日志,控制输出
    f1=logging.FileHandler('a.txt')
    f2=logging.FileHandler('b.txt')
    s=logging.StreamHandler()
    
    #formatter对象,日志格式
    format1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',)
    format2=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',)
    format3=logging.Formatter('%(name)s %(message)s',)
    
    #handler对象绑定格式
    f1.setFormatter(format1)
    f2.setFormatter(format2)
    s.setFormatter(format3)
    
    #将handler添加给logger并设置日志级别
    log1.addHandler(f1)
    log1.addHandler(f2)
    log1.addHandler(s)
    log1.setLevel(10)
    
    #测试
    log1.debug('debug')
    log1.info('info')
    log1.warning('warning')
    log1.error('error')
    log1.critical('critical')
    

      logging模块的应用:

    """
    logging配置
    """
    
    import os
    import logging.config
    
    # 定义三种日志输出格式 开始
    
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
    
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    
    # 定义日志输出格式 结束
    
    logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
    
    logfile_name = 'all2.log'  # log文件名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)
    
    # log配置字典
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},
        'handlers': {
            #打印到终端的日志
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            #打印到文件的日志,收集info及以上的日志
            'default': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024*1024*5,  # 日志大小 5M
                'backupCount': 5,
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        'loggers': {
            #logging.getLogger(__name__)拿到的logger配置
            '': {
                'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    
    
    def load_my_logging_cfg():
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
        logger = logging.getLogger(__name__)  # 生成一个log实例
        logger.info('It works!')  # 记录该文件的运行状态
    
    if __name__ == '__main__':
        load_my_logging_cfg()
    

      

  • 相关阅读:
    关于换行的问题
    Ubuntu 18.4 查看CUDNN版本
    opencv bgr转rgb
    python读写json文件
    timm库,PyTorchImageModels,简称timm,是一个巨大的PyTorch代码集合
    用SQL创建数据库登录用户
    《dsu on tree》深度剖析
    C#调用DLL报错:试图加载格式不正确的程序
    【项目】项目147
    【项目】项目148
  • 原文地址:https://www.cnblogs.com/qiaoqianshitou/p/8719066.html
Copyright © 2020-2023  润新知