Python logging模块
一、logging模块说明
logging是Python标准库中的一个模块,用于实现灵活且可配置的日志记录功能。它提供了一种简单且统一的方式来记录应用程序的运行状态、错误信息和其他相关信息。
logging模块的主要组件包括:
-
Logger(日志记录器):用于创建和管理日志记录器对象。通过调用
logging.getLogger(name)方法来创建一个日志记录器对象,其中name参数是一个可选的名称,用于标识不同的日志记录器。 -
Handler(处理器):用于指定日志的输出目标。
Handler对象可以将日志消息发送到文件、控制台、网络等不同的目标。常用的处理器包括StreamHandler(将日志输出到控制台)、FileHandler(将日志写入文件)等。 -
Formatter(格式化器):用于指定日志消息的格式。
Formatter对象定义了日志消息的布局,包括时间、日志级别、文件名、行号和具体日志消息等。可以通过调用setFormatter()方法将格式化器应用到处理器上。 -
Filter(过滤器):用于根据特定的条件过滤日志消息。
Filter对象可以根据日志级别、日志来源等条件来决定是否记录某条日志消息。
使用logging模块记录日志的基本步骤如下:
-
创建一个日志记录器对象,通过调用
logging.getLogger(name)方法。 -
设置日志记录器的日志级别,通过调用
setLevel(level)方法。 -
创建一个处理器对象,通过调用相应的处理器类(如
StreamHandler、FileHandler)。 -
设置处理器的日志级别,通过调用
setLevel(level)方法。 -
创建一个格式化器对象,通过调用
Formatter(format)方法。 -
将格式化器应用到处理器上,通过调用
setFormatter(formatter)方法。 -
将处理器添加到日志记录器中,通过调用
addHandler(handler)方法。 -
使用日志记录器的方法(如
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级别的日志输出")
其次也可以使用配置文件进行部署

浙公网安备 33010602011771号