zoukankan      html  css  js  c++  java
  • Python模块:logging、

    logging模块:

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误、警告等信息输出。Python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志。logging的日志可以分为debug()、info()、warning()、error() and critical()5个级别(按顺序,级别越来越高)。

    最简单的用法:

    import logging
    logging.warning('User [neo] attempted wrong password more than 3 times')
    logging.critical('server is down')
    
    #  运行结果:   # 跟print没啥区别
    #  WARNING:root:User [neo] attempted wrong password more than 3 times
    #  CRITICAL:root:server is down

    日志级别:

    把日志写到文件里:

    import logging
    logging.basicConfig(filename='logging_test.log',level=logging.INFO)  #  Do basic configuration for the logging system.   #  level=logging.INFO的意思是:只有日志是INFO或者比INFO级别更高的日志才会被记录在文件里 #  记录日志时,只会接着以前的日志继续记录,不会把以前的记录覆盖掉。
    logging.debug('debug test')
    logging.info('INFO info')
    logging.warning('Warning!')
    
    #  运行结果:  把logging.info和logging.warning记录在了 ‘logging_test.log’(.log的后缀名)这个文件里。   #  这种情况下屏幕上没打印,即 没有输出到屏幕
    #  如下所示:
    #  INFO:root:INFO info
    #  WARNING:root:Warning!

    把时间加到日志里面:

    import logging
    logging.basicConfig(filename='logging_with_time.log',
                        level=logging.INFO,
                        format='%(asctime)s  %(message)s',
                        datefmt='%Y-%m-%d  %H:%M:%S')   # 注意里面的参数‘format’和‘datefmt’
    
    logging.debug('debug test')
    logging.info('INFO info')
    logging.warning('Warning!')
    
    #  运行结果: INFO及其以上级别写入了‘logging_with_time.log’文件里面
    #  如下所示:
    #  2018-02-09  11:37:11  INFO info
    #  2018-02-09  11:37:11  Warning!

    除了加时间,还可以自定义其他的格式,下表就是所有支持的格式:

    logging进阶:日志同时输出到屏幕和文件:

    Python使用logging模块记录日志涉及四个主要的类:

    • logger提供了应用程序可以直接使用的接口
    • handler将(logger创建的)日志记录发送到合适的目的输出
    • filter提供了细度设备来决定输出哪条日志记录
    • formatter决定日志记录的最终输出格式

    它们之间的关系如下:

    logger:

    每个程序在输出信息之前都要先获得一个logger,如:

    import logging
    
    # 生成 logger 对象
    logger = logging.getLogger('web')   # logger通常对应了程序的模块名
    
    # 对logger对象设置Level级别,如设置成INFO级别 
    logger.setLevel(logging.INFO)   #  利用logger.setLevel()对生成的logger对象设置级别, logging.INFO是把级别具体设置成INFO,如果你不设置,系统会默认把Level设置成WARNING。 #  对logger对象设置level的作用: logger。setLevel()相当于一个全局变量,所需要输出的日志需要先经过logging.getLogger生成logger对象,所以生成logger对象之前,会先检测所输出的日志级别是否符合logger.setLevel的级别,如果符合则生成logger对象;如果不符合则直接忽略、不生成logger对象。 举例说明: 有两个需要输出的日志: logger.debug('test debug') 和 logger.info('test info') , 执行这两句代码的时候, 由于我已经给生成logger设置了level --- INFO:logger.setLevel(logging.INFO) ,debug的level低于INFO, 所以 logger.debug('test debug') 不会生成logger对象,但 logger.info('test info') 则会生成logger对象(相当于第一步生成logger对象时过滤了一部分数据)

    handler:

    handler负责发送相关的信息到指定目的地。 Python日志系统有多种handler可以使用。可以把信息输出到控制台(屏幕),也可以把信息输出到文件,把信息发送到网络上。自己也可以编写自己的handler。

    每个logger可以附加多个handler。常用的handler如下:

    1. logging.StreamHandler    # 使用这个handler可以向类似于sys.stdout 或者 sys.stderr 的任何文件对象(file object)输出信息(往屏幕上输出)
    2. logging.FileHandler   和 StreamHandler类似, 用于向一个文件输出日志信息,不过FileHandler会帮你打开这个文件(往文件中输出)
    3. 还有两种用法:一是根据文件大小截断;二是根据时间interval截断。  详情参考:  https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/logging-mo-kuai.html

    用法如下: 

    #  生成logger对象之后,再生成handler对象,然后把handler绑定到logger上
    
    # 生成handler对象
    ch = logging.StreamHandler()   # 负责往屏幕发送的handler(发送到屏幕,所以括号里面为空)
    fh = logging.FileHandler('web.log')   #  负责往文件“web.log”发送的handler   #  日志文件的后缀名: .log
    
    #  把生成的handler对象绑定到logger对象
    logger.addHandler(ch)   #  把ch这个handler对象绑定到logger上
    logger.addHandler(fh)   #  把fh这个handler对象绑定到logger上
    
    #  设置handler的level
    ch.setLevel(logging.INFO)   #  把ch这个handler对象的level设置成INFO
    fh.setLevel(logging.WARNING)   # 把fh这个handler对象的level设置成WARNING
    
    #  关于设置handler的level,道理跟logger的level设置类似,即: 如果你不设置, 程序会默认level是WARNING;通过这一步设置的level能够再次“过滤”数据
    # 关于logger设置的level和handler设置的level,按照哪个level呢? 效果上可以这么理解: 所需要输出的日志(如: logger.warning(xx)), 先经过logger设置的level“过滤”,然后在生成handler对象这一步, 再次经过这一步的level“过滤”:level符合,则生成相应的handler;level不符合则忽略、不生成handler对象。   

    formatter组件:

    日志的formatter是个独立的组件,可以跟handler组合, 用于设置所要发送的信息以什么样的格式发送到目的地。

    用法:

    #  生成handler对象之后,再生成formatter对象,然后将formatter对象和handler绑定
    
    # 生成formatter对象
    console_fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(message)s')  #  利用上面的logger名字表
    file_fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    #  把formatter对象绑定到handler
    ch.setFormatter(console_fmt)
    fh.setFormatter(file_fmt)      

    下面把上述的代码拼接到一起看效果:

    import logging
    
    # 生成logger对象
    logger = logging.getLogger('web')
    logger.setLevel(logging.INFO)
    
    # 生成handler对象
    ch = logging.StreamHandler()
    fh = logging.FileHandler('web.log')
    # 设置level
    ch.setLevel(logging.DEBUG)
    fh.setLevel(logging.WARNING)
    # 把handler绑定在logger上
    logger.addHandler(ch)
    logger.addHandler(fh)
    
    # 生成formatter对象
    console_fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(message)s')
    file_fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  #  %(name)s  这个name就是生成logger时括号里面的‘web’
    # 把formatter绑定到handler
    ch.setFormatter(console_fmt)
    fh.setFormatter(file_fmt)
    
    logger.debug('debug test')
    logger.info('info test')
    logger.warning('warning test')
    logger.error('error test')
    logger.critical('critical test')   # 输出的日志

     filter的用法参考: https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/logging-mo-kuai.html

  • 相关阅读:
    软件开发目录规范
    编译Python文件
    python文件的两种用途
    函数高级实战之ATM和购物车系统升级
    函数高级小结
    SpringCloud---(4)Eureka与Zookeeper的区别
    Maven父工程(统一管理依赖)
    SpringCloud-----(1)微服务基础概念
    传统项目架构图
    Session
  • 原文地址:https://www.cnblogs.com/neozheng/p/8434535.html
Copyright © 2011-2022 走看看