当前位置: 首页 > backend >正文

学习logging模块

logging模块详解

logging模块是Python标准库中处理日志记录的核心模块,提供了灵活且强大的日志记录功能,可帮助开发者在开发和调试过程中更好地监控程序运行状态。

目录

  • 一、包结构
  • 二、主要组件
    • 1. Logger
    • 2. Handler
    • 3. Formatter
    • 4. Filter
  • 三、基本使用方法
  • 四、高级配置
  • 五、最佳实践
  • 六、参考文档

一、包结构

Lib/logging/├── __init__.py    # 主接口文件├── config.py      # 配置相关实现├── handlers.py    # 各种Handler实现

二、主要组件

1. Logger

Logger是日志系统的入口,负责创建和管理日志记录。每个Logger都有一个名称,通过logging.getLogger(name)方法创建。

1.1 Logger对象的常用方法
  • debug(msg, *args, **kwargs): 记录DEBUG级别的日志。
  • info(msg, *args, **kwargs): 记录INFO级别的日志。
  • warning(msg, *args, **kwargs): 记录WARNING级别的日志。
  • error(msg, *args, **kwargs): 记录ERROR级别的日志。
  • critical(msg, *args, **kwargs): 记录CRITICAL级别的日志。
  • exception(msg, *args, exc_info=True, **kwargs): 记录ERROR级别的日志,并附带异常信息。
  • log(level, msg, *args, **kwargs): 通用的日志记录方法,可以指定日志级别。
  • addHandler(hdlr): 为Logger添加一个Handler。
  • removeHandler(hdlr): 从Logger中移除一个Handler。
1.2 Logger对象的常用属性
  • name: Logger的名称。
  • level: Logger的日志级别。
  • handlers: 一个包含所有已添加Handler的列表。
1.3 日志级别与记录方法的区别和联系

设置日志级别和使用 logger.debug 等方法是Python logging 模块中控制日志输出的重要部分,它们之间既有区别又有联系。

1.3.1 区别
  • 设置日志级别:在 LoggerHandler 对象上进行操作,决定哪些级别的日志记录会被处理。常见日志级别从低到高为 DEBUGINFOWARNINGERRORCRITICAL,通过 setLevel() 方法设置。例如:
import logginglogger = logging.getLogger('example')
logger.setLevel(logging.INFO)
  • 使用 logger.debug 等方法Logger 对象提供的方法,用于创建不同级别的日志记录。每个方法对应特定日志级别,例如:
logger.debug('这是一条 DEBUG 级别的日志记录')
logger.info('这是一条 INFO 级别的日志记录')
logger.warning('这是一条 WARNING 级别的日志记录')
logger.error('这是一条 ERROR 级别的日志记录')
logger.critical('这是一条 CRITICAL 级别的日志记录')
1.3.2 联系

设置日志级别和使用 logger.debug 等方法共同决定最终输出的日志记录。调用 logger.debug 等方法创建日志记录时,Logger 会检查该记录级别是否高于或等于设置的日志级别,若是则传递给 Handler 处理,否则忽略。

2. Handler

Handler负责将日志记录发送到指定目标,如控制台、文件、网络等。

2.1 StreamHandler

将日志输出到流中,通常是控制台。可通过sys.stdoutsys.stderr指定输出流。

2.2 FileHandler

将日志写入文件。可指定文件名和打开模式(如'a'表示追加,'w'表示覆盖)。

2.3 RotatingFileHandler

继承自FileHandler,支持日志文件自动轮转。文件达到指定大小后,自动创建新日志文件并保留旧文件。

2.4 TimedRotatingFileHandler

同样继承自FileHandler,按时间间隔轮转日志文件,如每天、每小时等。

3. Formatter

Formatter用于定义日志记录的格式,如时间、日志级别、消息内容等。可通过logging.Formatter类创建自定义格式。

4. Filter

Filter用于过滤日志记录,只允许符合条件的日志记录通过。可通过logging.Filter类创建自定义过滤器。

三、基本使用方法

1. 简单示例

import logging# 获取Logger对象
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)# 创建StreamHandler并添加到Logger
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)# 创建Formatter并添加到Handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)# 将Handler添加到Logger
logger.addHandler(ch)# 记录日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

2. 配置日志级别

日志级别从低到高依次为:DEBUG、INFO、WARNING、ERROR、CRITICAL。可通过setLevel方法设置Logger和Handler的日志级别。

3. 输出到文件

import logging# 获取Logger对象
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)# 创建FileHandler并添加到Logger
fh = logging.FileHandler('example.log')
fh.setLevel(logging.DEBUG)# 创建Formatter并添加到Handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 将Handler添加到Logger
logger.addHandler(fh)# 记录日志
logger.debug('This is a debug message')

四、高级配置

1. 使用配置文件

可使用配置文件配置日志系统,支持JSON、YAML等格式。以下是一个JSON配置文件示例:

{"version": 1,"disable_existing_loggers": false,"formatters": {"simple": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}}
}

2. 自定义Handler

可通过继承logging.Handler类创建自定义Handler,实现将日志记录发送到自定义目标。

import loggingclass MyHandler(logging.Handler):def __init__(self):super().__init__()def emit(self, record):msg = self.format(record)# 自定义处理逻辑print(f'Custom Handler: {msg}')# 使用自定义Handler
logger = logging.getLogger('custom')
logger.setLevel(logging.DEBUG)handler = MyHandler()
handler.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)logger.addHandler(handler)logger.debug('This is a custom handler message')

五、最佳实践

  • 为不同模块使用不同的Logger名称,方便日志管理和过滤。
  • 根据不同环境(开发、测试、生产)设置不同的日志级别。
  • 定期清理日志文件,避免占用过多磁盘空间。
  • 使用RotatingFileHandlerTimedRotatingFileHandler实现日志文件自动轮转。

六、参考文档

  • 官方文档
http://www.xdnf.cn/news/11921.html

相关文章:

  • nt!CcInitializeCacheMap函数分析初始化Vacbs结构
  • nmcli connection常用命令及设置wifi为AP模式
  • 【Redis实战:缓存与消息队列的应用】
  • Ethernet IP转Modbus网关在热泵机组中的协议转换技术实现
  • [C++入门]简化的艺术---对模版的初步探索
  • 敏捷项目管理:重塑价值交付的动态协作范式
  • 什么是内网映射?如何将内网ip映射到外网访问?
  • OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
  • 一起学Spring AI:核心概念
  • 极速唤醒:高通平台 Android15 默认跳过锁屏,秒启主界面!
  • 每天总结一个html标签——Audio音频标签
  • ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
  • iOS上传应用包错误问题 “Invalid bundle. The “UIInterfaceOrientationPortrait”“
  • 打卡第36天:模型可视化以及推理
  • 机器学习监督学习sklearn实战三:八种算法对印第安人糖尿病预测数据进行分类和比较
  • 什么是终端安全管理系统(终端安全管理软件2024科普)
  • 12306高并发计算架构揭秘:Apache Geode 客户端接入与实践
  • OpenCV C++ 心形雨动画
  • Web3时代的数据保护挑战与应对策略
  • Elasticsearch的插件(Plugin)系统介绍
  • Java中Git基础操作详解(clone、commit、push、branch)
  • 数据结构(7)—— 二叉树(1)
  • 【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)
  • Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
  • 【Vue】初学Vue(setup函数,数据响应式, 脚手架 )
  • vue 打包报错 Cannot find module ‘@vue/cli-plugin-babel/preset‘ - thread-loader
  • 力扣HOT100之二分查找:74. 搜索二维矩阵
  • 查找 Vue 项目中未使用的依赖
  • HashMap中的put方法执行流程(流程图)
  • 基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现+ui界面