zoukankan      html  css  js  c++  java
  • python——logging模块基础篇

    本文是以python官方文档howto logging 翻译附带部分自己改的代码

    1.Basic Logging Tutorial

    Logging 就是在软件运行时,追踪事件的发生。软件开发人员通过调用logging来确认特定事件的发生。开发者用一个消息来描述某个时间,具体描述可以包含变量数据(因为每次事件发生,变量可能是不同的)。另外不同的事件重要程度也不同,而重要性可以通过 level或者severity来描述。

    1.1. When to use logging

    Logging库为简单的logging提供了一组方便的函数,其中包括debug(),info(),warning(),error()和critical()。下表说明了何时使用什么函数来logging:

    Task you want to perform The best tool for the task
    在命令行显示一个程序(或脚本)的常规使用方法 print()
    报告在程序中一个常规事件(操作)的发生 logging.info() (or logging debug())
    针对特定事件发出警告 logging.warning() (or warnings.warn())
    报告有关特定运行时事件的错误 raise an exception
    在不引发异常时候报告对错误的抑制 logging.error(),logging.exception(),logging.critical()

    logging函数是根据他们的level命名的,具体描述如下:

    Level When it's used
    DEBUG 详细信息,通常只有在诊断问题时才感兴趣。
    INFO 确认一切正常
    WARNING 表示发生了意想不到的事情,或者表示在不久的将来出现了某个问题(例如“磁盘空间不足”)。该软件仍按预期工作
    ERROR 由于一个更严重的问题,软件无法执行一些功能
    CRITICAL 严重错误,指示程序本身可能无法继续运行。

    其中,WARNING是默认的level,这意味着只有高于或等于这个level的事件会被跟踪。
    另外,跟踪事件的最简单方法是打印到控制台,另一种常见的方法是将他们写入日志文件。

    1.2. A simple example

    import logging 
    logging.warning('Watch out!')  # will be display on the console
    logging.info('I told you so')  # won't be display by default 
    

    1.3. Logging to a file

    另外一种非常常见的情况是在文件中记录日志文件,下面让我们来看一下。注意一定要重新开启一个python解释器,而不要接着上面的代码继续写。

    import logging
    import os
    # 先删除过去的日志文件,否则会追加在后面
    if os.path.isfile('./example.log'):
        print('delete the last example.log')
        os.remove('./example.log')
    print('create a new example.log')
    logging.basicConfig(filename='example.log',level=logging.DEBUG)
    logging.debug('This message should go to the log file')  # all don't display on the console
    logging.info('So should this')
    logging.warning('And this, too')   # this is the highest level debug < info < waring < error < critical
    

    这个例子还向我们展示了如何设置level阈值(threshold),在这个例子中阈值设置为DEBUG,所以将所有消息都打印出来。另外你可以在命令行设置这个阈值:
    --log=INFO

    具体的代码写法如下:

    # 学习通过args输入loglevel来进行日志判别。
    # assuming loglevel is bound to the string value obtained from the
    # command line argument. Convert to upper case to allow the user to
    # specify --log=DEBUG or --log=debug
    parser = argparse.ArgumentParser(description='logging usage:')
    parser.add_argument('-l', '--log', default='WARING', type=str,
                        help='input loglevel')
    args = parser.parse_args()
    loglevel=args.log
    # getattr(obj,param1,param2)  获取obj中param1(可以是方法也可以是属性,其中方法后面+括号即可使用),如果没有就返回param2
    numeric_level = getattr(logging,loglevel.upper(),None)  # 将DEBUG这些字符串level转化为数字50level,否则输出None
    if not isinstance(numeric_level, int):
        raise ValueError('Invalid log level:%s'%loglevel)
    logging.basicConfig(level=numeric_level)
    

    另外函数调用basicConfig应该在debug(),info()这些之前。因为他是一个一次性的简单配置工具,所以只有第一个调用会实际执行任何操作,后续调用是无操作的。
    如果你多次运行脚本,example.log中的消息是追加的,如果你希望每次都重新开始(如我上面的写法),也可以按照下面的做:

    logging.basicConfig(filename='example.log',filemode='w',level=logging.DEBUG) 
    

    1.4. Logging from multiple modules

    如果你的程序包括多个模块,下面这个例子告诉你如何组织logging:
    在myapp.py文件中,代码如下:

    # myapp.py
    import logging
    import mylib
    
    def main():
        logging.basicConfig(filename='myapp.log',level=logging.DEBUG)
        logging.info('Started!')
        mylib.do_something()
        logging.info('Finished!')
    
    if __name__ == '__main__':
        main()
    

    在mylib.py文件中(也就是模块B),代码如下:

    # mylib.py
    import logging
    def do_something():
        logging.info('Doing something!')
    

    最后会在myapp.log中打印:

    INFO:root:Started!
    INFO:root:Doing something!
    INFO:root:Finished!
    
    

    上面这种简单的用法,你只能知道打印了Doing something,却不知道这个INFO是哪个model打印的。后面的Advanced logging tutorial会讲。

    1.5. Logging variable data

    logging模块是可以打印变量的,使用方法就是str.format({}.format类型)和str.Template(%s%d%f类型)。

    1.6. Changing the format of displayed messages

    关于logging打印的格式,也是在basicConfig中改变的使用关键词format=,具体例如如下:

    logging.basicConfig(format='%(filename)s,%(levelname)s:%(message)s',level=logging.DEBUG)
    logging.debug('this message should appear on the console')
    logging.info('So should this!')
    logging.warning('And this, too')
    
    

    打印结果如下:

    howto_logging.py,DEBUG:this message should appear on the console
    howto_logging.py,INFO:So should this!
    howto_logging.py,WARNING:And this, too
    

    另外其他的logging模型常用的format格式说明如下:

    format格式 格式说明
    %(levelno)s 打印日志级别的数值
    %(levelname)s 打印日志级别名称
    %(pathname)s 打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s 打印当前执行程序名
    %(funcName)s 打印日志的当前函数
    %(lineno)d 打印日志的当前行号
    %(asctime)s 打印日志的时间
    %(thread)d 打印线程ID
    %(threadName)s 打印线程名称
    %(process)d 打印进程ID
    %(message)s 打印日志信息

    以上就是简单的logging基础教程,本教程基本遵循官方文档howto logging,加上一点点自己的代码和注释。

    官方文档:https://docs.python.org/3.5/howto/logging.html

  • 相关阅读:
    BurpSuite—-Spider模块(蜘蛛爬行)
    BurpSuite系列(一)----Proxy模块(代理模块)
    hadoop HA集群搭建步骤
    HBase详解
    MapReduce两种执行环境介绍:本地测试环境,服务器环境
    HBase性能优化方法总结
    HDFS原理解析
    ZooKeeper 典型应用场景
    Redis总结
    基于Apache Curator框架的ZooKeeper使用详解
  • 原文地址:https://www.cnblogs.com/SsoZhNO-1/p/11910805.html
Copyright © 2011-2022 走看看