• logging模块


    一、函数式简单配置(低配)

    1、只能在屏幕上显示,或者写入文件,不能同时进行

    import logging
    logging.debug('调试')
    logging.info('正常运行')
    logging.warning('警告')
    logging.warn('警告')  #"The 'warn' function is deprecated(不赞成,反对), "use 'warning' instead"
    logging.error('错误')
    logging.critical('严重警告')
    
    默认格式只显示 级别:Logger名称:用户输出信息
    # WARNING:root:警告
    # WARNING:root:警告
    # ERROR:root:错误
    # CRITICAL:root:严重警告

    2、也可以设置日志格式后再显示

    import logging
    logging.basicConfig(level=logging.DEBUG,
                        # level=10,也可以用数字表示级别,级别从低到高依次是10,20,30,40,50
                        format='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
                        datefmt='%Y-%m-%d %H:%M:%S',  #2018-12-01 11:13:24
                        # datefmt='%a %d %b %Y %H:%M%S',  # 日期格式 Sat 01 Dec 2018 11:1659
                        filename='a.log',  #日志可以写到指定文件中,默认是a追加模式,且编码是GBK
                        # filemode='w'     #可以更改写入文件的模式,但是实际中一般也不改
                        )
    logging.debug('调试日志')
    logging.info('运行日志')
    logging.warning('警告日志')
    logging.error('错误日志')
    logging.critical('严重警告日志')
    # 2018-12-01 11:25:15 test.py [line:25) DEBUG 调试日志]
    # 2018-12-01 11:25:15 test.py [line:26) INFO 运行日志]
    # 2018-12-01 11:25:15 test.py [line:27) WARNING 警告日志]
    # 2018-12-01 11:25:15 test.py [line:28) WARNING 警告日志]
    # 2018-12-01 11:25:15 test.py [line:29) ERROR 错误日志]
    # 2018-12-01 11:25:15 test.py [line:30) CRITICAL 严重警告日志]

     

    二、logger对象配置(标配)

    可以设置在屏幕显示和写入文件

    import logging
    
    #创建logging对象
    logger = logging.getLogger()
    
    #创建文件对象
    fh1 = logging.FileHandler('a1.log', encoding='utf-8')
    fh2 = logging.FileHandler('a2.log', encoding='utf-8')
    
    #创建屏幕对象
    sh = logging.StreamHandler()
    
    #分别设置日志格式
    formater1 = logging.Formatter(
        fmt='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    formater2 = logging.Formatter(
        fmt='%(asctime)s %(filename)s %(levelname)s %(message)s]',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    formater3 = logging.Formatter(
        fmt='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
        datefmt='%a %d %b %Y %H:%M%S'
    )
    
    
    #给对象绑定格式
    fh1.setFormatter(formater1)
    fh2.setFormatter(formater2)
    sh.setFormatter(formater3)
    
    logger.addHandler(fh1)
    logger.addHandler(fh2)
    logger.addHandler(sh)
    
    logger.setLevel(20) #logger级别设置为20
    fh1.setLevel(30)    #fh1级别设置为30,要比logger级别高才可以,否则按logger级别为准
    fh2.setLevel(30)    #fh2级别设置为30,要比logger级别高才可以,否则按logger级别为准
    sh.setLevel(40)     #sh级别设置为40,要比logger级别高才可以,否则按logger级别为准
    
    logging.debug('调试日志')
    logging.info('运行日志')
    logging.warning('警告日志')
    logging.error('错误日志')
    logging.critical('严重警告日志')
    
    #a1.log
    # 2018-12-01 12:07:18 test.py [line:84) WARNING 警告日志]
    # 2018-12-01 12:07:18 test.py [line:85) ERROR 错误日志]
    # 2018-12-01 12:07:18 test.py [line:86) CRITICAL 严重警告日志]
    
    # a2.log
    # 2018-12-01 12:07:18 test.py WARNING 警告日志]
    # 2018-12-01 12:07:18 test.py ERROR 错误日志]
    # 2018-12-01 12:07:18 test.py CRITICAL 严重警告日志]
    
    # 屏幕显示
    # Sat 01 Dec 2018 12:0718 test.py [line:85) ERROR 错误日志]
    # Sat 01 Dec 2018 12:0718 test.py [line:86) CRITICAL 严重警告日志]

    logging库提供了多个组件:Logger、Handler、Filter、Formatter。
      Logger对象提供应用程序可直接使用的接口
      Handler发送日志到适当的目的地
      Filter提供了过滤日志信息的方法
      Formatter指定日志显示格式
    另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。

    三、logger的配置文件(高配)

    有的同学习惯通过logger的对象配置去完成日志的功能,但是上面这种方式需要创建各种对象,比如logger对象,fileHandler对象,ScreamHandler对象等等,比较麻烦,那么下面给你提供一种字典的方式,创建logger配置文件,这种才是工作中经常使用的实现日志功能的方法。

    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_name = 'log_test.log'
    logfile_dir = os.path.dirname(__file__)
    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' #调用上面键值对的key
            },
            #打印到文件的日志
            'default' :{
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler', #保存到文件,使用循环切片的方法保存
                'formatter': 'standard',
                'filename': logfile_path, #调用上面定义的日志文件路径
                'maxBytes': 1024*1024*100,  #日志文件大小,这里设置最大为100M
                'backupCount': 5,  #日志文件个数,这里设置最多5个
                'encoding': 'utf-8', #这里可以设置文件编码,不用担心乱码了
            }
        },
        'loggers':{
            #logging.getLogger(__name__)拿到的logger配置
            '':{
                'handlers': ['default', 'console'], #这里把上面定义的两个handler都加上,可以实现log既打印到屏幕又写入文件
                'level': 'DEBUG',  #设置日志级别,要低于或等于上面分别设置的日志级别
                'propagate': True, #向上(更高level的logger)传递,一般不改
            },
        },
    }
    
    #定义打印日志的函数get_log
    def get_log():
        logging.config.dictConfig(LOGGING_DIC)  #导入上面定义的logging的字典配置
        logger = logging.getLogger(__name__)  #生成一个logger实例
        logger.debug('调试日志')
        logger.info('运行日志')
        logger.warning('警告日志')
        logger.error('错误日志')
        logger.critical('严重警告日志')
    
    #调用get_log函数
    get_log()
    
    # 屏幕显示结果:
    # [DEBUG][2018-12-01 14:34:00,348][test.py:62]调试日志
    # [INFO][2018-12-01 14:34:00,348][test.py:63]运行日志
    # [WARNING][2018-12-01 14:34:00,348][test.py:64]警告日志
    # [ERROR][2018-12-01 14:34:00,349][test.py:65]错误日志
    # [CRITICAL][2018-12-01 14:34:00,349][test.py:66]严重警告日志
    #
    # log_test.log文件保存结果:
    # [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:62][DEBUG][调试日志]
    # [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:63][INFO][运行日志]
    # [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:64][WARNING][警告日志]
    # [2018-12-01 14:34:00,349][MainThread:6492][task_id:__main__][test.py:65][ERROR][错误日志]
    # [2018-12-01 14:34:00,349][MainThread:6492][task_id:__main__][test.py:66][CRITICAL][严重警告日志]   

    上面打印出来的task_id都是相同的,如果想要不同应用系统打印不同的task_id,可以在调用日志函数的时候传入task_id名称

    #定义打印日志的函数get_log
    def get_log(taskname):
        logging.config.dictConfig(LOGGING_DIC)  #导入上面定义的logging的字典配置
        logger = logging.getLogger(taskname)  #生成一个logger实例
        return logger
    
    #调用get_log函数
    log_a = get_log('a系统')
    log_a.warning('警告日志')
    
    log_b = get_log('b系统')
    log_b.error('错误日志')
    
    log_c = get_log('c系统')
    log_c.critical('严重警告日志')
    
    # 屏幕显示结果:
    [WARNING][2018-12-03 13:35:19,359][test.py:120]警告日志
    [ERROR][2018-12-03 13:35:19,360][test.py:123]错误日志
    [CRITICAL][2018-12-03 13:35:19,361][test.py:126]严重警告日志
    
    # log_test.log文件保存结果:
    [2018-12-03 13:35:19,359][MainThread:6940][task_id:a系统][test.py:120][WARNING][警告日志]
    [2018-12-03 13:35:19,360][MainThread:6940][task_id:b系统][test.py:123][ERROR][错误日志]
    [2018-12-03 13:35:19,361][MainThread:6940][task_id:c系统][test.py:126][CRITICAL][严重警告日志]
  • 相关阅读:
    python—9个基础常识-python小白入门系列
    学完Python,我决定熬夜整理这篇总结...
    Python中时间戳、时间字符串、时间结构对象之间的相互转化
    [Python3] 超级码力在线编程大赛初赛 第2场 题解
    利用人工智能算法让古代皇帝画像以及古代四大美女画像动起来(模仿偶像胡歌剧中角色表情动作
    python爬取酷我音乐(收费也可)
    Python基础入门:从变量到异常处理–阿里云天池
    python 使用 wechatsogou wkthmltopdf 导出微信公众号文章
    ASP.NET WebAPI 连接数据库
    从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简的实现前后台ajax表格展示及分页实现
  • 原文地址:https://www.cnblogs.com/dxnui119/p/10057979.html
Copyright © 2020-2023  润新知