python log日志常用用法总结

  • Post author:
  • Post category:python


python log日志常用用法总结

非常感谢下面这篇博客的博主,翻译的很好,讲的非常全,如果大家想要系统的学一下,可以选择下面的文章。本文只是总结在实际应用中的常用方法和函数介绍。



日志输出



日志等级划分
  • DEBUG 等级最低的,最详细的日志信息,典型应用场景是 问题诊断
  • INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
  • WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
  • ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
  • CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

总之,从上到下,日志等级越来越高

import logging
logging.debug('this is a debug')
logging.info('this is a info')
logging.warning('this is a warning')
logging.error('this is a error')
logging.critical('this is a critical')
out:
WARNING:root:this is a warning
ERROR:root:this is a error
CRITICAL:root:this is a critical

这里我们可以看到,我们上面写了五个不同级别的输出,但是在控制台的输出只有三个。其原因是logging模块默认的级别是

warning

,所以只能输出三个日志信息。

那我想都输出出来怎么办?来配置basicConfig()方法



logging.basicConfig()

从名字中,我们就能够看出,这是一个配置函数,首先介绍一下他的几个参数

  • filename 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了
  • filemod 指定日志文件的打开方式,默认为’a’ .

    注:

    模式a为在文件末尾追加。模式w是重新写入。
  • format 指定日志格式字符串,下面会给出相应表格
  • datefmt 指定日期/时间格式
  • level 指定日志器的日志级别
  • stream 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream,和filename冲突,二者只能设置一个


logging模块format格式字符串字段

这里我直接截取文章开头那篇博客的图

image-20210704222630267



配置后的日志输出
  • 输出到文件中
import logging
logging.basicConfig(filename='mylog.log',level=logging.DEBUG)
logging.debug('this is a debug')
logging.info('this is a info')
logging.warning('this is a warning')
logging.error('this is a error')
logging.critical('this is a critical')
mylog.log 
DEBUG:root:this is a debug
INFO:root:this is a info
WARNING:root:this is a warning
ERROR:root:this is a error
CRITICAL:root:this is a critical
  • 自定义格式
# 日志发生时间 - 日志级别 - 日志记录的内容 
LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT)
logging.debug('this is a debug')
logging.info('this is a info')
logging.warning('this is a warning')
logging.error('this is a error')
logging.critical('this is a critical')
out
2021-07-04 22:33:00,347 - DEBUG - this is a debug
2021-07-04 22:33:00,347 - INFO - this is a info
2021-07-04 22:33:00,347 - WARNING - this is a warning
2021-07-04 22:33:00,347 - ERROR - this is a error
2021-07-04 22:33:00,347 - CRITICAL - this is a critical

注意 LOG_FORMAT 中间的连接符号可以更换 比如

-、+、=

  • 带有参数的日志信息
import logging

# 日志发生时间 - 日志级别 - 日志记录的内容
LOG_FORMAT = '%(asctime)s + %(levelname)s - %(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT)
a='ya'
b=11
logging.debug('this is a debug %s %d',a,b)
logging.info('this is a info')
logging.warning('this is a warning')
logging.error('this is a error')
logging.critical('this is a critical')
out
2021-07-04 22:40:31,262 + DEBUG - this is a debug ya 11
2021-07-04 22:40:31,262 + INFO - this is a info
2021-07-04 22:40:31,262 + WARNING - this is a warning
2021-07-04 22:40:31,262 + ERROR - this is a error
2021-07-04 22:40:31,262 + CRITICAL - this is a critical

参数类型通过%s、%d等来指定,然后后面直接接逗号跟着参数就行了

  • 添加额外的独特的信息

比如在这个场景下,小组每个人负责不同的模块,最终组合运行的时候,需要给自己负责模块输出日志中,添加具有区分度的东西,比如自己的代号等等。

介绍三个参数:



  1. exc_info:


    其值为布尔值,如果该参数的值设置为True,则会将异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。


  2. stack_info:


    其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。


  3. extra:


    这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。
import logging
# 日志发生时间 - 日志级别 -  - 名称 -日志记录的内容
LOG_FORMAT = '%(asctime)s - %(levelname)s - %(username)s - %(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT)
try:
    b=1/0
except:
    logging.error('this is a error',exc_info=True,extra={'username':'xing'})

logging.debug('this is a debug',exc_info=True,stack_info=True,extra={'username':'xing'})
logging.info('this is a info',exc_info=True,extra={'username':'xing'})
logging.warning('this is a warning',exc_info=True,extra={'username':'xing'})
logging.critical('this is a critical',exc_info=False,extra={'username':'xing'})

out
2021-07-04 23:04:32,548 - ERROR - xing - this is a error
Traceback (most recent call last):
  File "C:/Users/test/yaml.py", line 8, in <module>
    b=1/0
ZeroDivisionError: division by zero
2021-07-04 23:04:32,549 - DEBUG - xing - this is a debug
NoneType: None
Stack (most recent call last):
  File "C:/Users/test/yaml.py", line 12, in <module>
    logging.debug('this is a debug',exc_info=True,stack_info=True,extra={'username':'xing'})
2021-07-04 23:04:32,549 - INFO - xing - this is a info
NoneType: None
2021-07-04 23:04:32,549 - WARNING - xing - this is a warning
NoneType: None
2021-07-04 23:04:32,549 - CRITICAL - xing - this is a critical

从结果我们能够看到,error 输出下面,出现了异常信息,其他下面只是显示了NoneType:None,我们可以通过这样的手段,将异常信息进行捕获,然后再进行输出。



总结

基本上项目中常用的方法和函数都在这里,了解完这些,应该也就够用了。



版权声明:本文为lzx159951原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。