日志logging代替print调试代码

2021/08/29 python logging 共 2257 字,约 7 分钟

日志logging调试代码

目录:

日志消息是给程序员的,不是给用户的。用户不会因为你便于调试,而想看到 的字典值的内容。请将日志信息用于类似这样的目的。对于用户希望看到的消息, 例如“文件未找到”或者“无效的输入,请输入一个数字”,应该使用print() 调用。 我们不希望禁用日志消息之后,让用户看不到有用的信息。

作为一个非专业的程序员,调试代码一般都用print输出。现在偶然看到logging日志的方式来调试。做一个记录学习一下

用日志调试代码的优势

  1. print的缺点:如果用print调试代码,到代码调试成功之后还需要去删除或者注释掉print的一些语句,有时候还会误删一些需要用的print语句或者其他重要的语句。
  2. logging的优点:
    • logging在你调试代码之后可以用一行语句将所有的logging去除掉,省去了上述删除和注释的麻烦。
    • logging可以将你调试过程中输出的内容保存为一个文件,方便你回去看每次调试的结果。

使用日志模块

简单使用

下面是一个例子,具体的情况是factorial函数是计算阶乘(1*2*3*4*5*…*(n-1)*n)的函数,我们想看函数每次乘的数是什么,以及总和是多少。 可以使用logging模块。

import logging

logging.basicConfig(level=logging.DEBUG,
                    format=' %(asctime)s - %(levelname)s- %(message)s')

logging.debug('Start of program')
def factorial(n):
    logging.debug('Start of factorial(%s%%)' % (n))
    total = 1
    for i in range(n + 1):
        total *= i
        logging.debug('i is ' + str(i) + ', total is ' + str(total))
    logging.debug('End of factorial(%s%%)' % (n))
    return total
print(factorial(5))
logging.debug('End of program')

输出结果如下所示:

 2021-08-29 15:37:43,560 - DEBUG- Start of program
 2021-08-29 15:37:43,560 - DEBUG- Start of factorial(5%)
 2021-08-29 15:37:43,560 - DEBUG- i is 0, total is 0
 2021-08-29 15:37:43,560 - DEBUG- i is 1, total is 0
 2021-08-29 15:37:43,560 - DEBUG- i is 2, total is 0
 2021-08-29 15:37:43,561 - DEBUG- i is 3, total is 0
 2021-08-29 15:37:43,561 - DEBUG- i is 4, total is 0
 2021-08-29 15:37:43,561 - DEBUG- i is 5, total is 0
 2021-08-29 15:37:43,561 - DEBUG- End of factorial(5%)
 2021-08-29 15:37:43,561 - DEBUG- End of program
0

标明了日期的行是日志的记录。最后的”0“是输出的内容。

保存在文件中

如果我们想要保存在一个文件里面,可以在logging.basicConfig()里面添加filename

import logging

logging.basicConfig(filename= 'logging file of this program.txt',
                    level=logging.DEBUG,
                    format=' %(asctime)s - %(levelname)s- %(message)s')

加上后不会显示logging的内容,可以打开txt文件看每次调试后得到的logging内容。

Logging Disable

只需要在前面加一句话就可以将所有的内容取消掉。

import logging

logging.basicConfig(filename= 'logging file of this program.txt',
                    level=logging.DEBUG,
                    format=' %(asctime)s - %(levelname)s- %(message)s')
logging.disable()

# 后续的logging.debug()都会失效,记住要加在basicConfig之后,其他debug之前。

Other functions of logging

如果想不只是输出debug的内容,想记录一些其他的内容(比如error,warning),则需要根据不同重要程度来按重要性对日志消息进行分类。 python一般有5 个日志级别,如下表所示:

级别日志函数描述
DEBUGlogging.debug()最低级别。用于小细节。通常只有在诊断问题时,你才会关心这些消息
INFOlogging.info()用于记录程序中一般事件的信息,或确认一切工作正常
WARNINGlogging.warning()用于表示可能的问题,它不会阻止程序的工作,但将来可能会
ERRORlogging.error()用于记录错误,它导致程序做某事失败
CRITICALlogging.critical()最高级别。用于表示致命的错误,它导致或将要导致程序完全停止

日志消息作为一个字符串,传递给这些函数。日志级别是一种建议。归根到底,还是由你来决定日志消息属于哪一种类型。

文档信息

Search

    Table of Contents