Python logging模块

一、logging模块说明

logging是Python标准库中的一个模块,用于实现灵活且可配置的日志记录功能。它提供了一种简单且统一的方式来记录应用程序的运行状态、错误信息和其他相关信息。

logging模块的主要组件包括:

  1. Logger(日志记录器):用于创建和管理日志记录器对象。通过调用logging.getLogger(name)方法来创建一个日志记录器对象,其中name参数是一个可选的名称,用于标识不同的日志记录器。

  2. Handler(处理器):用于指定日志的输出目标。Handler对象可以将日志消息发送到文件、控制台、网络等不同的目标。常用的处理器包括StreamHandler(将日志输出到控制台)、FileHandler(将日志写入文件)等。

  3. Formatter(格式化器):用于指定日志消息的格式。Formatter对象定义了日志消息的布局,包括时间、日志级别、文件名、行号和具体日志消息等。可以通过调用setFormatter()方法将格式化器应用到处理器上。

  4. Filter(过滤器):用于根据特定的条件过滤日志消息。Filter对象可以根据日志级别、日志来源等条件来决定是否记录某条日志消息。

使用logging模块记录日志的基本步骤如下:

  1. 创建一个日志记录器对象,通过调用logging.getLogger(name)方法。

  2. 设置日志记录器的日志级别,通过调用setLevel(level)方法。

  3. 创建一个处理器对象,通过调用相应的处理器类(如StreamHandlerFileHandler)。

  4. 设置处理器的日志级别,通过调用setLevel(level)方法。

  5. 创建一个格式化器对象,通过调用Formatter(format)方法。

  6. 将格式化器应用到处理器上,通过调用setFormatter(formatter)方法。

  7. 将处理器添加到日志记录器中,通过调用addHandler(handler)方法。

  8. 使用日志记录器的方法(如debug()info()warning()error()critical())记录日志消息。

通过使用logging模块,可以方便地记录和管理应用程序的日志,以便于调试、错误追踪和性能分析。

二、logging的日志等级

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

该列表中的日志等级是从上到下依次增高,日志内容依次减少,即DEBUG可以显示所有日志,CRITICAL只能显示自己。例子如下

import logging

logging.debug("这是debug级别的日志输出")
logging.info("这是info级别的日志输出")
logging.warning("这是warning级别的日志输出")
logging.error("这是error级别的日志输出")
logging.critical("这是critical级别的日志输出")

输出结果:

WARNING:root:这是warning级别的日志输出
ERROR:root:这是error级别的日志输出
CRITICAL:root:这是critical级别的日志输出

注意:之所以出现以上结果说明默认的日志级别为WARNING

三、logging的使用方法

常用函数

函数说明
logging.debug(msg, *args, **kwargs) 创建一条级别为DEBUG的日志记录
logging.info(msg, *args, **kwargs) 创建一条级别为INFO的日志记录
logging.warning(msg, *args, **kwargs) 创建一条级别为WARNING的日志记录
logging.error(msg, *args, **kwargs) 创建一条级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs) 创建一条级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs) 创建一条级别为level的日志记录
logging.basicConfig(**kwargs) 对root logger进行一次性配置

不推荐使用basicConfig对日志等级进行自我创作,因为会影响代码的移植性,代码在别人那里容易起冲突

import logging

# filename: 日志文件的位置
# filemode:日志写入的模式
# level:修改日志级别

# Python中默认的日志级别为:warning,以上如果filename和filemode不设置 则会输出在控制台
logging.basicConfig(filename='test.log', filemode='w', level=logging.DEBUG)

logging.debug("这是debug级别的日志输出")
logging.info("这是info级别的日志输出")
logging.warning("这是warning级别的日志输出")
logging.error("这是error级别的日志输出")
logging.critical("这是critical级别的日志输出")

常规的配置

import logging

# 输出内容为:2022-03-24 09:31:42,546|WARNING|This is warning
# asctime输出时间日期
# levelname日志级别
# message 输入的具体日志信息 This is warning
# %(filename)s:%(lineno)s  那个文件的第几行
logging.basicConfig(format="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s", datefmt="%Y-%d-%m %H:%M:%S", level=logging.DEBUG)

logging.debug("This is debug")
logging.warning("This is warning")

四、logging的高级应用

4.1.相关组件介绍

名称作用
Loggers 记录器,提供应用程序代码直接使用的接口
Handlers 处理器,将记录器产生的日志发送至目的地
Filters 过滤器,提供更好的粒度控制,决定哪些日志会被输出
Formatters 格式化,设置日志内容的组成结构和消息字段

4.2.流程图

4.3.组件说明

4.3.1.记录器

1.提供应用程序的调用接口
import logging

# 注意get_logger是单例
get_logger = logging.getLogger(__name__)

2.决定日志的记录级别
# 设置记录日志的级别
get_logger.setLevel(logging.DEBUG)

3.将日志内容传递到相关的handlers
get_logger.addHandler()和 get_logger.removeHandler()

4.3.2.处理器

它们将日志分发到不同的目的地。可以是文件、控制台、标准输出、 邮件、或者通过socket、 http等协议发送到任何地方。

# StreamHandler 标准输出stdout分发器
consoleHandler = logging.StreamHandler()  # 输出到控制台
# 设置处理器的级别
consoleHandler.setLevel(logging.DEBUG)

# FileHandler
# 如果不给handler指定日志级别,将使用logger的级别
"""
filename='test.log'  日志保存的文件
mode='a' 写入的模式
encoding='utf-8' 指定字符集
delay=False  指定缓存
"""
fileHandler = logging.FileHandler(filename='test.log', mode='a', encoding='utf-8', delay=False) # 将日志写入到文件
fileHandler.setLevel(logging.INFO)

注意:所有的handler都可以用setFormatter() 设置当前handler对象使用的消息格式,其实就是可以指定日志输出的格式

# 给处理器设置格式
consoleHandler.setFormatter(f)
fileHandler.setFormatter(f)

4.3.3.格式化:Formatters格式

Formatters格式说明如下:

属性格式描述
asctime %(asctime)s 日志产生的时间,默认格式为msecs2003-07-0816:49:45,896
msecs %(msecs)d 日志生成时间的亳秒部分
created %(created)f time.tme)生成的日志创建时间戳
message %(message)s 具体的日志信息
filename %(filename)s 生成日志的程序名
name %(name)s 日志调用者
funcname %( funcname)s 调用日志的函数名
levelname %(levelname)s 日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL)
levene %( leveling)s 日志级别对应的数值
lineno %(lineno)d 日志所针对的代码行号(如果可用的话)
module %( module)s 生成日志的模块名
pathname %( pathname)s 生成日志的文件的完整路径
process %( (process)d 生成日志的进程D(如果可用)
processname (processname)s 进程名(如果可用)
thread %(thread)d 生成日志的线程D(如果可用)
threadname %( threadname)s 线程名(如果可用)

代码如下:

# formatter格式
f = formatter = logging.Formatter("%(asctime)s|%(levelname)s|%(filename)s%(lineno)s|%(message)s")

# 给处理器设置格式
consoleHandler.setFormatter(f)
fileHandler.setFormatter(f)

4.3.4过滤器

# 定义一个过滤器 , 如下设置an 那么过滤器创建时设置名字的中有an则会忽略
# ft = logging.Filter('an')
# # 给记录器设置过滤器
# logger.addFilter(ft)

4.3.5.案例

代码如下:

import logging

# 创建记录器
logger = logging.getLogger('analog')
# 设置记录器的日志级别
logger.setLevel(logging.DEBUG)

# 处理器 handle
consoleHandler = logging.StreamHandler()  # 输出到控制台
# 设置处理器的级别
consoleHandler.setLevel(logging.DEBUG)

# 如果不给handler指定日志级别,将使用logger的级别
fileHandler = logging.FileHandler(filename='addDemo.log') # 将日志写入到文件
fileHandler.setLevel(logging.INFO)

# formatter格式
f = formatter = logging.Formatter("%(asctime)s|%(levelname)s|%(filename)s%(lineno)s|%(message)s")

# 给处理器设置格式
consoleHandler.setFormatter(f)
fileHandler.setFormatter(f)

# 给记录器设置处理器
logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)

# 定义一个过滤器 , 如下设置an 那么过滤器创建时设置名字的中有an则会忽略
# ft = logging.Filter('an')
# # 给记录器设置过滤器
# logger.addFilter(ft)

# 记录日志
logger.debug("这是debug级别的日志输出")
logger.info("这是info级别的日志输出")
logger.warning("这是warning级别的日志输出")
logger.error("这是error级别的日志输出")
logger.critical("这是critical级别的日志输出")

其次也可以使用配置文件进行部署

posted @ 2022-03-25 10:56  酒剑仙*  阅读(339)  评论(0)    收藏  举报