通常我们在调试脚本程序时,一般是使用print()来调试,但是一个坏处是:如果我们的脚本程序很长,当调试完成了,我们必须将所有调试的print()注释掉或删除掉,极不方便。这时使用内置logging模块就完全满足我们的要求,是时候在调试时用logging.debug全面替换掉print()了.
logging模块定义了下表所示的日志级别,按事件严重程度由低到高排列(注意是全部大写!因为它们是常量。):
级别 | 级别数值 | 使用时机 |
---|---|---|
DEBUG | 10 | 详细信息,常用于调试。 |
INFO | 20 | 程序正常运行过程中产生的一些信息。 |
WARNING | 30 | 警告用户,虽然程序还在正常工作,但有可能发生错误。 |
ERROR | 40 | 由于更严重的问题,程序已不能执行一些功能了。 |
CRITICAL | 50 | 严重错误,程序已不能继续运行。 |
默认级别是WARNING,表示只有WARING和比WARNING更严重的事件才会被记录到日志内,低级别的信息会被忽略。因此,默认情况下,DEBUG和INFO会被忽略,WARING、ERROR和CRITICAL会被记录。
有多种方法用来处理被跟踪的事件。最简单的方法就是把它们打印到终端控制台上。
下面是一个简单的实例
在使用过程中可以直接用logging.debug()来替换print()
如果程序调试好,可以通过修改level来控制debug info的输出,
eg:将以下这句的level = logging.DEBUG换为logging.INFO就可以了.
logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level = logging.INFO)
import logging
from logging import debug
logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level = logging.DEBUG)
def func(s):
str1 = 'Loop'
str2 = 'leap'
debug(f's的数据类型为 {type(s)}, {s}')
debug(f'{str1} before you {str2}')
return s/10
if __name__ == '__main__':
func('100')
format='%(levelname)s:%(funcName)s:%(message)s'是个什么鬼?
format中的那个变量是logging内置的keys,如下表所示(只有我常用的部分), 所不用强记,有需要时翻一翻就直接用就好了.
属性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志产生的时间,默认格式为2003-07-08 16:49:45,896 |
created | %(created)f | time.time()生成的日志创建时间戳 |
funcName | %(funcName)s | 调用日志的函数名 |
levelname | %(levelname)s | 日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
lineno | %(lineno)d | 日志所针对的代码行号(如果可用的话) |
module | %(module)s | 生成日志的模块名 |
message | %(message)s | 具体的日志信息 |
name | %(name)s | 日志调用者 |