python基础_标准库-logging
一、简介
1、概要:logging 是python 用于记录日志的标准模块
2、logging 日志库定义的日志级别:
级别 | 级别数值(int) | 使用时机 |
DEBUG | 10 | 详细信息 |
INFO | 20 | 正常运行过程中产生的一些信息 |
WARNING | 30 | 警告信息,虽然程序正常运行,但有可能发生错误 |
ERROR | 40 | 运行出错,程序已经不能执行一些功能了 |
CRITICAL | 50 | 严重错误,程序已经不能正常运行 |
3、logging 日志库的四类组件(四个类)
Logger :记录器 提供了应用程序代码直接使用的接口 (是用记录器去记录日志,简单理解就是 记录日志的工具,类似 笔)(备注:一个记录器可以对接多个处理器)
Handlers : 处理器 将记录器产生的日志发送至指定的目的地 (就是日志输出的位置,比如输出到本地文件,控制台,或者发送至Email 等网络上的任意位置,)
Filters: 过滤器 提供了更细粒度的功能,用于确定要输出的日志记录 (过滤日志用的)
Fomatters: 格式器:指定最终输出中日志记录的样式。 (日志信息格式化用的)
二、logging 模块的工作流程
Logger 记录器:
1、创建记录器对象:
logger=logging.getLogger(name=None) name 如果不传 则返回 一个 root logger,
2、设置日志记录器的级别
loger.setLevel()
3、讲日志内容传递到关联的handler
loger.addHandler() 关联一个处理器
loger.removeHandler() 取消关联
Handler 处理器
StreamHandler类型 :标准的输出stdout (比如显示器输出,控制台输出) 分发器
创建方法:logging.StreamHandler(stream=None)
FileHandler类型:将日志保存到磁盘文件的处理器
创建方法:file_handler = logging.FileHandler(filename='xx.log',mode='a',encoding='utf-8')
设置当前处理器对象使用的日志格式:
file_handler.setFormatter(ojb) #ojb 为 一个格式器对象
其他常用的 处理器类型:
BaseRotatingHandler
Rotating Filehandler 滚动的多日志输出,按照时间or其他方式去生成多个日志
TimedRotatingfilehandler
Formatter 格式器
Formatter 格式器用来最终设置日志信息的顺序,结构和内容
创建方法
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%lineno)s|%(message)s")
Formatter对象的格式:
属性 | 格式 | 描述 |
---|---|---|
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 | 线程名(如果可用) |
Filter 过滤器
可以被 Handler 和 Logger 调用 用来实现比按层级提供更复杂的过滤操作。
创建过滤器:
flt = logging.Filter("cn.cccb")
在处理器和记录器中进行过滤
logger.addFilter(flt)
file_handler.addFilter(flt)
三、一个简单的例子
以下例子实现了一个日志记录器同时往控制台和本地文件输入不同级别的日志
import logging # 创建一个日志记录器 loger = logging.getLogger('applog') # 设置日志记录器的等级 INFO loger.setLevel(logging.INFO) # 创建一个将流式的日志处理器 steram_handler = logging.StreamHandler() # loger.removeHandler() #接触绑定 #创建一个 输出到磁盘文件的日志处理器 file_handler=logging.FileHandler(filename='file.log',mode='w',encoding='utf-8') # file_handler 设置日志等级为 ERROR ,没有给handler 设置日志级别,该handler 将使用logger设置或者默认的级别 file_handler.setLevel(logging.ERROR) # 创建一个日志格式器 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") # 设置处理器输出的日志格式 file_handler.setFormatter(formatter) steram_handler.setFormatter(formatter) # 设置一个过滤器 fl1 = logging.Filter('app2log') # 给日志记录器设置一个过滤器 ,(从根部开始过滤) # loger.addFilter(fl1) #还可以给 handler 设置过滤器 (在输出的时候过滤) steram_handler.addFilter(fl1) # 记录器设置一个处理器 loger.addHandler(steram_handler) loger.addHandler(file_handler) # 写入日志 loger.debug('debug log') loger.info('info log') loger.warning('warning log') loger.error('error log') loger.critical('critical log')
注意:Handler 可设置的日志级别是Logger 的设置的日志级别的子集(如果Logger没设置,默认是WARNING)
假设Logger 设置INFO 级别的日志,Handler 设置的DEBUG级别的日志,那Handler 还是只能输出INFO 及以上级别的日志
四、写在最后:
logging本质是实现了一个日志记录器按指定的等级获取日志,在处理器上设置日志格式以及等级后,通过处理器输出日志到指定位置
同时还可以通过filter 过滤器从logger 或者handler 处过滤不同记录器产生的日志
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具