一、日志是什么?
日志是对软件执行时所发生事件的一种追踪方式。软件开发人员对他们的代码添加日志调用,借此来指示某事件的发生。通过对日志的调用方便我们查询信息,追踪问题和调试维护。
二、为什么使用日志?
在写程序的时候,我们会写很多print来调试程序,验证正确后往往会注释掉。一旦验证的地方比较多,再注释就相对麻烦,这时候使用logging就很方便,直接把验证信息存在一个文件中。
1.事件等级
日志功能应以所追踪事件级别或严重性而定。各级别适用性如下(以严重性递增):
级别 | 何时使用 |
---|---|
DEBUG | 细节信息,仅当诊断问题时适用。 |
INFO | 确认程序按预期运行。 |
WARNING | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行。 |
ERROR | 由于严重的问题,程序的某些功能已经不能正常执行 |
CRITICAL | 严重的错误,表明程序已不能继续执行 |
默认的级别是 WARNING,意味着会追踪该级别及以上的事件,则默认追踪(WARNING ,ERROR 和CRITICAL )
2.简单例子
import logging
logging.info('info')
logging.warning('warning')
'''
命令行中的输入结果:
WARNING:root:warning
'''
可以发现命令行的INFO 消息并没有出现,因为默认级别是 WARNING。会忽略DEBUG和INFO级别的消息。
3.记录日志到文件
import logging
log_filename = 'D:\\Jupyter_Workspace\\log\\log.txt'
logging.basicConfig(filename=log_filename, encoding='utf-8', level=logging.DEBUG)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
此时我们的命令行将不会有输出,打开日志文件log.txt如下
由于我们设置的阈值是 DEBUG,所有等级的信息都将被打印。对 basicConfig() 的调用应该在 debug() , info() 等之前。例如我们接着上面代码改变配置,并多次运行以下代码
logging.basicConfig(filename=log_filename, encoding='utf-8', level=logging.INFO)
logging.info('==============')
logging.debug('debug')
logging.info('info')
我们发现在日志中还是会输出debug的消息,即使我们将配置等级更改为INFO。因为它被设计为一次性的配置,只有第一次调用会进行操作,随后的调用不会产生有效操作。即logging的等级依然是第一次配置的DEBUG。
连续运行的消息将追加到文件log.txt中。如果你希望每次运行重新开始,而不是记住先前运行的消息,则可以通过将上例中的调用更改为指定 filemode 参数:
logging.basicConfig(filename=log_filename, filemode='w', level=logging.DEBUG)
logging.info('***************')
logging.debug('debug')
logging.info('info')
logging.info('***************')
logging.debug('debug')
logging.info('info')
logging.debug('debug')
logging.info('***************')
更改显示消息的格式
logging.basicConfig(filename=log_filename,format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.info('###############')
logging.debug('debug')
logging.info('info')
可以发现指定格式后日志中的root消失了,只显示levelname和message。对于可以出现在格式字符串中的全部内容,你可以参考
消息中显示日期/时间
显示事件的日期和时间,你可以在格式字符串中放置 ‘%(asctime)s’
logging.basicConfig(filename=log_filename,filemode='w',
format='%(asctime)s %(levelname)s: %(message)s',
level=logging.DEBUG)
logging.info('@@@@@@@@@@@')
logging.debug('debug')
logging.info('info')
"""
日志中的输入结果:
2022-03-30 11:05:39,613INFO:@@@@@@@@@@@
2022-03-30 11:05:39,613DEBUG:debug
2022-03-30 11:05:39,613INFO:info
"""
如果你需要更多地控制日期/时间的格式,请为 basicConfig 提供 datefmt 参数,如下例所示:
logging.basicConfig(filename=log_filename,filemode='w',
format='%(asctime)s %(levelname)s: %(message)s',
datefmt="%m-%d-%Y %H:%M:%S",
level=logging.DEBUG)
logging.info('@@@@@@@@@@@')
logging.debug('debug')
logging.info('info')
"""
日志中的输出结果:
03-30-2022 11:11:41 INFO: @@@@@@@@@@@
03-30-2022 11:11:41 DEBUG: debug
03-30-2022 11:11:41 INFO: info
"""