zoukankan      html  css  js  c++  java
  • 模块-logging

    python的logging模块提供标准的日志接口,可以通过它存储各种格式的日志。

    日志级别优先顺序:logger优先handler。logger默认级别为warning,logger全局一般设置为DEBUG,否则handler上的DEBUG级别格式就无法输出

    过滤顺便:logger->handler

    logging日志级别分别为debug(),info(),warnging(),error(),critical()

    • debug():调试程序
    • info()普通记录
    • warning()无错误,有潜在问题
    • error()程序出错,可能导致数据出错
    • critical()严重错误,影响服务

    简单用法

    例:

    默认屏幕输出

    import logging
    logging.warning('user [Wang] attempted wrong password more than 10 tims')
    logging.critical('Server is down')
    # WARNING:root:user [Wang] attempted wrong password more than 10 tims
    # CRITICAL:root:Server is down
    

    写入文件

    import logging
    logging.basicConfig(filename='example.log',level=logging.INFO)
    #level:只记录此级别或比此级别更高的日志
    logging.debug('This message should go to the log file')
    logging.info('So should this')
    logging.warning('And this,too')
    

     自定义日志格式

    指定时间:

    import logging
    logging.basicConfig(filename='example.log',level=logging.INFO,format='%(asctime)s %(message)s',datefmt='%Y-%m-%d %I:%M:%S %p')
    #level:只记录此级别或比此级别更高的日志
    logging.debug('This message should go to the log file')
    logging.info('So should this')
    logging.warning('And this,too')
    

    日志格式占位符:

    #%(levelno)s:数字形式的日志级别
    #%(levelname)s:文本形式日志级别
    #%(name)s:logger名字 #%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有 #%(filename)s:调用日志输出函数的模块的文件名 #%(module)s:调用日志输出函数的模块名 #%(funcName)s:调用日志输出函数的函数名 #%(lineno)d:调用日志输出函数语句所在的代码行 #%(created)s:当前时间,用unix标准的表示时间的浮点数表示 #%(relativeCreated)d:输出日志信息是,自Logger创建以来的毫秒数 #%(asctime)s:字符串形式的当前时间,默认是”年-月-日 时:分:秒,毫秒“格式 #%(thread)d:线程ID,可能没有 #%(threadName)s:线程名,可能没有 #%(process)d:线程ID,可能没有 #%(message)s:用户输出消息

    多个输出路径

    logger:

    提供应用程序可以直接使用的接口。Logger通常对应了程序的模块名

    例:

    #聊天工具模块
    LOG=logging.getLogger("chat.gui")
    
    #核心模块
    LOG=logging.getLogger('chat.kernel')
    #绑定handler和filters
    LOG.setLevel(level=logging.DEBUG)
    LOG.addFilter(filter='')
    LOG.removeFilter(filter='')

    LOG.addHandler(hdlr='')
    LOG.removeHandler(hdlr='')

    handler:

    将logger创建的日志记录发送到指定的目的地,如屏幕,文件,网络。Logger可以通过addHandler()添加多个handler。

    handler上可以指定日志级别,格式,filter对象

    例:

    handler=logging.Handler()#创建handler
    handler.setLevel(level=logging.INFO)#指定级别
    handler.setFormatter()#设置日志格式
    handler.addFilter(filter='')#添加过滤
    handler.removeFilter(filter='')#删除过滤
    • logging.StreamHandler:类似sys.stdout或sys.stderr的任何文件对象输出信息
    • logging.FileHandler:向日志文件输出信息,FileHandler自动打开文件
    • logging.handlers.RotatingFileHandler:类似FileHandler,但可以管理文件大小,达到一定大小后会自动修改名称再重新创建日志文件。如chat.log修改为chat.log.1...chat.log.2
    • logging.handlers.TimedRotatingFileHandler:间隔一段时间自动创建一个新的日志文件。

    formatter

    决定日志最总输出格式。可以和handler或logger组合

    例:

    fh=logging.FileHandler('access.log')
    formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
    fh.setFormatter(formatter)#将formatter绑定到handler上

    例子:

    import logging
    #生成logger对象
    logger=logging.getLogger('web')
    logger.setLevel(logging.INFO)
    
    #生成handler对象
    ch=logging.StreamHandler()
    ch.setLevel(logging.DEBUG)#对handler设置级别
    fh=logging.FileHandler('web.log')
    fh.setLevel(logging.WARNING)#对handler设置级别
    #把handler对象绑定到logger对象
    logger.addHandler(ch)
    logger.addHandler(fh)
    
    #生成formatter对象
    file_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
    console_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(lineno)d %(message)s')
    #把formatter对象添加到handler对象
    ch.setFormatter(console_formatter)
    fh.setFormatter(file_formatter)
    
    logger.debug('debug test log')
    logger.info('info test log')
    logger.error('error test log')
    

    confole输出:

    file输出:

    filter

    对用户输出的日志进行过滤

    例:

    import logging
    class IgnoreBackupLogFilter(logging.Filter):
        """忽略db backup的日志"""
        def filter(self, record):#固定写法
            return "db backup" not in record.getMessage()#返回True记录,False不记录
    
    #生成logger对象
    logger=logging.getLogger('web')
    logger.setLevel(logging.DEBUG)
    #将filter对象添加到logger中
    logger.addFilter(IgnoreBackupLogFilter())
    
    #生成handler对象
    ch=logging.StreamHandler()
    ch.setLevel(logging.DEBUG)#对handler设置级别
    fh=logging.FileHandler('web.log')
    fh.setLevel(logging.WARNING)#对handler设置级别
    #把handler对象绑定到logger对象
    logger.addHandler(ch)
    logger.addHandler(fh)
    #生成formatter对象
    file_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
    console_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(lineno)d %(message)s')
    #把formatter对象添加到handler对象
    ch.setFormatter(console_formatter)
    fh.setFormatter(file_formatter)
    
    logger.debug('db backup test')
    logger.debug('not  test')
    

    console输出:

    日志截断

    例:

    import logging
    from logging import handlers
    logger=logging.getLogger()
    #按文件大小分割文件
    handler_size=handlers.RotatingFileHandler('web.log', mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)#100字节大小,存3份
    #按时间间隔分割文件
    handler_time=handlers.TimedRotatingFileHandler('web.log', when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
    #when,指定时间间隔类型
    # 'S'         |  秒
    # 'M'         |  分
    # 'H'         |  时
    # 'D'         |  天
    # 'W0'-'W6'   |  周一至周日
    # 'midnight'  |  每天的凌晨
    #handler_time=handlers.TimedRotatingFileHandler('web.log', when='D', interval=1, backupCount=10, encoding=None, delay=False, utc=False)
    #每1存一个文件,一共存10个
    logger.addHandler(handler_size)
    logger.addHandler(handler_time)
  • 相关阅读:
    【ProjectT】Tapestry
    【ProjectT】Tapestry • Quick Start • Hello World
    【ProjectT】《Pragmatic Version Control Using CVS》【Chapter 2】
    【Notes】《Thinking in Java》【Chapter 11】Part II
    【ProjectT】《Pragmatic Version Control Using CVS》【Chapter 1】
    【ProjectT】Tapestry • Quick Start • DirectLink
    【ProjectT】Pragmatic Version Control Using CVS
    【Notes】《Thinking in Java》【Chapter 11】
    【ProjectT】Tapestry • Quick Start • Forms
    【ProjectT】Tapestry • Quick Start • Introduction
  • 原文地址:https://www.cnblogs.com/yaya625202/p/8679719.html
Copyright © 2011-2022 走看看