zoukankan      html  css  js  c++  java
  • 【Python】代码调试(pdb与logging使用)

    一、pdb使用

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

    在程序中间插入一段程序(import pdb     pdb.set_trace() ),相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的

    1、加入断点

    #!/usr/bin/python 
    import pdb 
     
    _DEBUG = True 
    def debug_demo(val): 
        if _DEBUG == True: 
            pdb.set_trace() 
        if val <= 1600 : 
            print "level 1" 
            print 0 
        elif val <= 3500 : 
            print "level 2" 
            print (val - 1600) * 0.05 
        elif val <= 6500 : 
            print "level 3" 
            print (val - 3500) * 0.10 + (3500 - 1600) * 0.05 
        else: 
            print "level 4" 
            print (val - 6500) * 0.20 + (6500 - 3500) * 0.10 + (3500 - 1600) * 0.05 
    
    
    # ~def debug_demo                 
    
    if __name__ == "__main__": 
        debug_demo(4500)
     

    2、开始调试

    image

    image

    二、logging使用

    # encoding:utf-8
    import logging
     
    log1 = logging.getLogger('a.b.c') 
    log2 = logging.getLogger('a.d.e') 
    
    filehandler = logging.FileHandler('test.log', 'a') 
    formatter = logging.Formatter('%(name)s %(asctime)s %(levelname)s %(message)s') 
    filehandler.setFormatter(formatter) 
    filter = logging.Filter('a') 
    filehandler.addFilter(filter) 
    
    log1.addHandler(filehandler) 
    log2.addHandler(filehandler) 
    
    log1.setLevel(logging.DEBUG) 
    log2.setLevel(logging.DEBUG) 
    
    log1.debug('it is a debug info for log1') 
    log1.info('normal infor for log1') 
    log1.warning('warning info for log1:b.c') 
    log1.error('error info for log1:abcd') 
    log1.critical('critical info for log1:not worked') 
    
    
    log2.debug('debug info for log2') 
    log2.info('normal info for log2') 
    log2.warning('warning info for log2') 
    log2.error('error:b.c') 
    log2.critical('critical')

    image

    logging lib 包含 4 个主要对象

    • logger:logger 是程序信息输出的接口。它分散在不同的代码中使得程序可以在运行的时候记录相应的信息,并根据设置的日志级别或 filter 来决定哪些信息需要输出并将这些信息分发到其关联的 handler。常用的方法有 Logger.setLevel(),Logger.addHandler() ,Logger.removeHandler() ,Logger.addFilter() ,Logger.debug(), Logger.info(), Logger.warning(), Logger.error(),getLogger() 等。logger 支持层次继承关系,子 logger 的名称通常是父 logger.name 的方式。如果不创建 logger 的实例,则使用默认的 root logger,通过 logging.getLogger() 或者 logging.getLogger("") 得到 root logger 实例。
    • Handler:Handler 用来处理信息的输出,可以将信息输出到控制台,文件或者网络。可以通过 Logger.addHandler() 来给 logger 对象添加 handler,常用的 handler 有 StreamHandler 和 FileHandler 类。StreamHandler 发送错误信息到流,而 FileHandler 类用于向文件输出日志信息,这两个 handler 定义在 logging 的核心模块中。其他的 hander 定义在 logging.handles 模块中,如 HTTPHandler,SocketHandler。
    • Formatter:Formatter 则决定了 log 信息的格式 , 格式使用类似于 %(< dictionary key >)s 的形式来定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的 key 可以在 python 自带的文档 LogRecord attributes 中查看。
    • Filter:Filter 用来决定哪些信息需要输出。可以被 handler 和 logger 使用,支持层次关系,比如如果设置了 filter 为名称为 A.B 的 logger,则该 logger 和其子 logger 的信息会被输出,如 A.B,A.B.C.

  • 相关阅读:
    UVA 221
    A Typical Homework(学生信息管理系统)
    追踪电子表格中的单元格
    浮点数!!!(摘)
    poj 3158kickdown
    循环小数 UVa202
    Unix is 命令
    W
    V
    完美世界 字符串倒置输出
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3725388.html
Copyright © 2011-2022 走看看