Python Logging 日志模块新手入门

       这也是规划里的一篇工具文章,在写项目代码的时候不但要考虑代码的架构代码的后期维护和调试等也是一个比较关键的问题,之前写代码的时候日志这块的代码直接是任务驱动简单搜了一下就用了,但是秉持着打好基础的精神在这里也是总结一篇基础向的文档。在一个项目中在写代码时,除了要将训练代码运行起来运行稳定,也需要通过日志来记录,程序运行期间发生的事件,以便于了解系统活动和诊断。然后我也是参考总结了Python官方的文档RealPython进行总结然后加上自己的理解得到的。

1.简单了解Logging模块


       Logging库是python的一个自带库,也就是不需要安装就能直接使用的库,因此可以直接在程序的开头直接导入logging库即可使用无需安装。

import logging

       导入了logging之后你可以使用一个叫logger的东西去提交你想用的日志信息,在使用logger之前需要知道在logger提交默认情况下有五种表示不同严重程度的日志信息,官方文档中级别解释的表格如下。
在这里插入图片描述
       下面是我结合自己的理解手动翻译的,如果有问题欢迎交流讨论。

严重等级Level何时使用
DEBUG一些细节信息,只有当诊断一些运行问题的时候有用
INFO证实一些流程已经按照预期进行了
WARING表明了一些意外的发生,或者表明将要发生的一些问题,但这些问题不会让软件停止运行
ERROR由于一些严重的问题软件已经不能使用某些功能
CRITICAL一个很严重的问题,这个问题让系统或者代码直接停止运行了。

接下来使用logger来提交五种信息。

import logging

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

运行结果如下。
在这里插入图片描述

WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message

       首先默认状态下日志的输出格式为严重等级:用户名:信息,这个后期可以自己设置,然后能注意到.dubug().info()两种方法的输出没有显示在控制台上,因为logging模块有一个参数表示进行相应的最低的严重程度当当前严重程度等于超过logging中设置的最低严重程度时候,才会响应这个日志提交并在控制台中打印出来,在不进行配置的情况下logging模块的最低的严重程为Wraning

2.Logging模块的基础配置


我们可以通过basicConfig()方法来配置logging,下面是一些常用的参数:

  • level:设置日报配置模块响应的最低严重等级
  • filename:记录日志信息的文件名称
  • filemode:用于配置filename的记录方式默认是a也就是不断追加的模式(配置该参数需要先配置filename参数)。
  • format:提交的日志信息的格式。

首先给出第一个参数level运行的例子程序

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

对比发现之前不相应的INFODEBUG这俩给略低的严重程度已经被响应了。
在这里插入图片描述
接下来后学习后三个参数的例子代码如下:

import logging

logging.basicConfig(filename='app.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.warning('This will get logged to a file')

运行之前项目文件夹的情况如下:
在这里插入图片描述
运行之后,控制台没有输出,但是项目列表下生成了一个app.log文件。
在这里插入图片描述
打开日志文件,日志信息已经保存到了里面。
在这里插入图片描述

3.设计Logging的输出格式


       由于实际的业务场景中可能需要对logging的format格式做更详细的以及进一步的调整,因此再来了解一下format格式的其他属性,在format格式中自定义变量的方法,这里举几个简单的例子。


  • 例子一:
import logging

logging.basicConfig(format='%(process)d-%(levelname)s-%(message)s')
logging.warning('This is a Warning')

运行结果如下,其中%(process)d表示的是进程号31156,%(levelname)s表示消息的严重程度等级,%(message)s表示警告信息:

31156-WARNING-This is a Warning
  • 例子二:
import logging

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('Admin logged in')

结果如下%(asctime)s为响应时间,%(message)s为提示信息。

2024-04-26 10:10:33,052 - Admin logged in
  • 例子三:

还可以通过datefmt调整响应%(asctime)s的格式

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Admin logged out')

输出结果,中间的变为了英文月份。

26-Apr-24 10:20:07 - Admin logged out

       这里的关键在每一个属性的格式都是用%(属性)字母,例如%(asctime)s有基础的同学或者工程师朋友,应该也可以知道括号后面的字母是数据的格式,例如asctime为字符串格式所以后面使用的字母为s,process进程号为整数所以后面跟的是d。那这里怎么知道每个属性是什么类型和实际的含义,官方给了一张所有属性的表,可以查,官方表的链接如下,用到的时候去插一下就可以了。

https://docs.python.org/3/library/logging.html#logrecord-attributes
在这里插入图片描述

4.给日志信息添加一个动态变量


除了这些已经有的属性之外,我还想让日志监测一个动态变量,官方方式如下。

import logging

name = 'John'

logging.error('%s raised an error', name)
ERROR:root:John raised an error

或者在字符串前面加f来格式化字符串,我比较喜欢这种,这种格式需要在python3.6之后的版本才可以使用。

import logging

name = 'John'

logging.error(f'{name} raised an error')

5.让提交的日志信息同时记录在文件中且输出在控制台上并分别自定义输出格式-handler操作使用


       在logging模块中需要用到一个概念handler操作器,通过这个东西,你可以通过配置不同的日志记录器,并根据你配置的操作器的格式通过不同方式发送你的日志信息。

       以下代码实现了配置两种操作器,一种是控制台输出的操作器,一种是输出在自定义的日志文件中,然后两个操作器设置的最低响应级别和输出格式都实现了自己的单独的配置。

import logging

logger = logging.getLogger(__name__)

c_handler = logging.StreamHandler()    #控制台输出操作器  
f_handler = logging.FileHandler('file.log', mode='a', encoding='utf-8')  #文件记录操作器
c_handler.setLevel(logging.WARNING) #设置控制台操作器最低响应等级
f_handler.setLevel(logging.ERROR)   #设置文件记录操作器最低响应等级

c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')     #设置控制台输出操作器日志格式
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  #文件记录器操作器日志格式
c_handler.setFormatter(c_format)   #加载控制台输出操作器输出的日志格式
f_handler.setFormatter(f_format)   #加载文件记录操作器日志格式

logger.addHandler(c_handler)       #加载控制台输出操作器 
logger.addHandler(f_handler)       #加载文件记录操作器 

logger.warning('This is a warning')
logger.error('This is an error')

运行前:
在这里插入图片描述
运行后,第一次运行左侧多了一个日志文件:
在这里插入图片描述
日志文件的内容如下:
在这里插入图片描述

结束

  • 日志记录器可以跨文件使用,在一个文件中初始化了日志记录器的配置logger,将logger传给其他程序也可以使用,将不通文件中的提交的日志信息记录在一个日志文件中

下面是两个参考内容。

官方文档地址:https://docs.python.org/3/library/logging.html
在这里插入图片描述
realpython教程地址:https://realpython.com/python-logging/
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐