zoukankan      html  css  js  c++  java
  • Python模块-logging模块(二)

    logging模块记录日志有四个主要类:logger,handler,formatter,filter

    logger提供了应用程序可以直接使用的接口,每个程序在输出信息之前都要获得一个Logger

    handler将(logger创建的)日志记录发送到合适的目的输出,handler可以把信息输出到控制台,也可以把信息输出到文件,还可以把信息发送到网络上

    formatter决定日志记录的最终输出格式

    filter用来过滤日志记录,filter函数返回布尔值,logger根据返回的布尔值决定过滤的语句

    在屏幕打印日志的同时写入日志文件:

    # -*- coding:utf-8 -*-
    __author__ = "MuT6 Sch01aR"
    
    import logging
    
    class IgnoreBackupLogFilter(logging.Filter):
        '''忽略带warning的日志'''
        def filter(self, record): #固定写法
            return 'warning' not in record.getMessage() #返回布尔类型
    
    logger = logging.getLogger('web') #生成一个Logger对象,web为logger对象的名称
    logger.setLevel(logging.INFO) #设置等级,默认为warning
    
    stream_handler = logging.StreamHandler() #生成handler对象,用于屏幕上打印
    file_handler = logging.FileHandler('web.log') #生成handler对象。用于生成日志文件
    
    #把handler对象绑定到logger
    logger.addHandler(stream_handler)
    logger.addHandler(file_handler)
    # logger.removeHandler(stream_handler) #删除handler对象
    # logger.removeHandler(file_handler)
    
    #生成formatter对象,用于屏幕上打印
    stream_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s - %(message)s')
    #生成formatter对象,用于日志文件
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelno)s - %(message)s')
    
    #把formatter对象到handler对象
    stream_handler.setFormatter(stream_formatter)
    file_handler.setFormatter(file_formatter)
    
    logger.addFilter(IgnoreBackupLogFilter()) #对日志内容进行过滤
    #logger.removeFilter(IgnoreBackupLogFilter()) #删除filter对象
    
    logger.debug('The Debug')
    logger.info('The info')
    logger.warning('The warning')
    logger.error('The error')
    logger.critical('The critical')
    

     运行结果

    日志内容

    日志截断

    根据文件大小

    如日志文件为web.log,当web.log达到指定的大小之后,RotatingFileHandler自动把文件改名为web.log.1,如果web.log.1已经存在,会先把web.log.1重命名为web.log.2,最后重新创建web.log,继续输出日志信息

    handlers.RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
    

    filename和mode两个参数和FileHandler一样,maxBytes为日志文件最大的大小,如果maxBytes为0,意味着日志文件可以无限大,就不再新建日志文件了。backupCount为生成的最多备份日志文件数,如果指定为3,就最多生成3个备份日志文件,如果备份日志文件已经生成3个了,再生成日志文件的话,web.log.3并不会被更名,而是被删除

    # -*- coding:utf-8 -*-
    __author__ = "MuT6 Sch01aR"
    
    import logging
    from logging import handlers
    
    logger = logging.getLogger('web')
    logger.setLevel(logging.INFO)
    
    file_handler = handlers.RotatingFileHandler('web.log',maxBytes=5,backupCount=3)
    
    logger.addHandler(file_handler)
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelno)s - %(message)s')
    
    file_handler.setFormatter(file_formatter)
    
    logger.debug('The Debug')
    logger.info('The info')
    logger.warning('The warning')
    logger.error('The error')
    logger.critical('The critical')
    

     运行

    生成了4个日志文件,web.log为最新的日志,web.log.3为最早的日志

    根据时间

    间隔指定的时间自动创建新的日志文件,重命名的过程与RotatingFileHandler类似,不过新的文件的命名方式为当前的时间

    handlers.TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
    

     filename参数和backupCount参数和RotatingFileHandler的作用一样

    when参数是一个字符串。表示时间间隔的单位,不区分大小写。S为秒,M为分,H为小时,D为天,W为每星期(interval=0时为星期一),midnight为每天凌晨

    interval为时间间隔

    # -*- coding:utf-8 -*-
    __author__ = "MuT6 Sch01aR"
    
    import logging
    from logging import handlers
    
    logger = logging.getLogger('web')
    logger.setLevel(logging.INFO)
    
    file_handler = handlers.TimedRotatingFileHandler('web.log',when='s',interval=3,backupCount=5)
    
    logger.addHandler(file_handler)
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelno)s - %(message)s')
    
    file_handler.setFormatter(file_formatter)
    
    logger.debug('The Debug')
    logger.info('The info')
    logger.warning('The warning')
    logger.error('The error')
    logger.critical('The critical')
    

    每隔5秒生成一个,需要运行才生成

    运行结果

    等级

    logger设置的等级为最高的,脚本中以此为主

    handler中设置的等级级别比logger设置的等级级别低

    所以handler中打印的日志建立在logger的级别上,再考虑handler设置的等级

  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8450613.html
Copyright © 2011-2022 走看看