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

Python 工程中如何构架合理的log体系

在这里插入图片描述

在Python工程中构建合理的日志体系,需要遵循一些最佳实践和原则。以下是基于我搜索到的资料,构建合理日志体系的详细步骤:

1. 使用Python内置的logging模块

Python自带的logging模块是一个功能强大且灵活的日志记录工具,可以满足大多数项目的需求。它提供了四个主要组件:logger、handler、filter和formatter。

  • Logger:提供日志接口,供应用代码使用。
  • Handler:将日志记录发送到合适的目的地,如文件、控制台等。
  • Filter:决定一个日志记录是否发送到handler。
  • Formatter:指定日志记录输出的具体格式。

2. 配置日志级别

根据项目的不同阶段(开发、测试、生产),设置不同的日志级别。例如,在开发阶段可以使用DEBUG级别以获取详细的调试信息,而在生产环境中则可以使用ERROR级别以减少日志量并专注于错误信息。

import logging

# 配置日志记录系统
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename='app.log', filemode='a')

3. 创建和使用Logger对象

在每个模块中创建一个logger对象,并使用__name__作为其名称。这有助于区分不同模块的日志信息。

# 创建一个Logger对象
logger = logging.getLogger(__name__)

4. 配置多个Handler

根据需求配置多个handler,以适应不同级别的日志记录。例如,可以将INFO级别的日志记录到文件中,而将ERROR级别的日志记录到另一个文件或发送到邮件。

# 创建一个文件handler
fh = logging.FileHandler('app.log')
fh.setLevel(logging.DEBUG)

# 创建一个控制台handler
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)

# 创建formatter并添加到handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 将handler添加到logger
logger.addHandler(fh)
logger.addHandler(ch)

5. 使用Formatter格式化日志

定义日志的输出格式,确保日志信息包含必要的上下文信息,如时间戳、模块名、日志级别和消息内容。

# 定义formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

6. 中心化日志配置

将日志配置集中在一个地方,以便于管理和维护。可以使用配置文件(如JSON或YAML)来设置logging系统。

import logging.config

# 从配置文件加载日志配置
logging.config.fileConfig('logging.conf')

7. 使用RotatingFileHandler避免日志文件过大

在生产环境中,使用RotatingFileHandlerTimedRotatingFileHandler来限制日志文件的大小或按时间轮转日志文件,以避免日志文件占用过多磁盘空间。

from logging.handlers import RotatingFileHandler

# 创建一个RotatingFileHandler
rh = RotatingFileHandler('app.log', maxBytes=1024*1024*5, backupCount=5)
rh.setLevel(logging.DEBUG)
rh.setFormatter(formatter)

# 将handler添加到logger
logger.addHandler(rh)

8. 记录异常信息

在捕获异常时,使用exc_info=True参数将异常信息和堆栈跟踪记录到日志中。

try:
    # 可能会引发异常的代码
    pass
except Exception as e:
    logger.error("发生异常", exc_info=True)

9. 使用模块化结构组织日志代码

将日志配置和日志记录逻辑封装在一个独立的模块中,以便在整个项目中复用。

# log_config.py
import logging.config

def setup_logging():
    logging.config.fileConfig('logging.conf')

# main.py
import log_config

log_config.setup_logging()
logger = logging.getLogger(__name__)

10. 避免在加载配置文件前创建Logger

在需要时动态创建Logger,并在Python 2.7及以后版本中使用disable_existing_loggers参数来避免覆盖现有Logger。

import logging

# 动态创建Logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

通过以上步骤,可以构建一个合理且高效的日志体系,帮助开发者更好地进行调试和问题排查。

Python的logging模块支持多种日志格式内容,具体包括以下几个方面:

  1. 日志级别

    • logging模块定义了五个标准的日志级别,从低到高分别为:DEBUG、INFO、WARNING、ERROR和CRITICAL。这些级别的设置决定了哪些日志会被记录下来。
  2. 日志格式字符串

    • 日志格式字符串(format)是定义日志输出内容的关键部分。常见的格式字符串包括:
  • %(asctime)s:时间戳,显示日志生成的时间。
  • %(levelname)s:日志级别名称,如DEBUG、INFO等。
  • %(name)s:日志记录器的名称。
  • %(module)s:生成日志的模块名。
  • %(funcName)s:生成日志的函数名。
  • %(lineno)d:生成日志的代码行号。
  • %(message)s:日志消息内容。
  1. 日期时间格式
    • 可以通过datefmt参数自定义日期时间的格式。例如,'%Y-%m-%d %H:%M:%S'表示年-月-日 时:分:秒。


4. 日志输出目标

  • 日志可以输出到不同的目标,如控制台(StreamHandler)、文件(FileHandler)、网络等。通过配置不同的处理器(Handler),可以实现日志的多路输出。
  1. 文件配置

    • 可以通过basicConfig函数或配置文件(如INI格式)来设置日志的基本配置,包括文件名、日志级别、格式等。
  2. 自定义日志格式

    • 除了标准的格式字符串,还可以使用%格式化或{}格式化来构建自定义的日志格式。例如:
  • %s:字符串。
  • %d:整数。
  • %f:浮点数。
  • {}:字典键值对。
  1. 高级功能

    • 支持按时间滚动的日志文件(TimedRotatingFileHandler)和按大小滚动的日志文件(RotatingFileHandler)。
    • 支持自动清空日志文件(TimedRotatingFileHandler)。
    • 支持多用户日志管理。
  2. 日志处理器

    • logging模块提供了多种处理器(Handler),如StreamHandler(控制台输出)、FileHandler(文件输出)、RotatingFileHandler(按大小滚动的日志文件)等,可以根据需要选择合适的处理器。
  3. 过滤器

    • 可以通过Filter类对日志进行细粒度的控制,决定哪些日志应该被记录下来。
  4. 自定义日志级别

  • 除了标准的日志级别,还可以通过代码自定义新的日志级别,并为其设置相应的处理程序。

Python的logging模块提供了灵活且强大的日志记录和格式化功能,能够满足不同场景下的日志需求。

在Python的logging模块中,日志级别是用于控制日志输出的重要机制。日志级别从低到高分别为:DEBUG、INFO、WARNING、ERROR和CRITICAL。每个级别的具体含义如下:

  1. DEBUG:调试信息,通常用于开发阶段,记录详细的程序运行信息,如变量值、函数调用等。调试信息是最详细的日志级别,适用于开发者进行问题排查和代码优化。例如:
   logging.debug('This is a debug message')

这条日志会在调试模式下输出,帮助开发者了解程序的内部运行情况。

  1. INFO:一般信息,记录程序运行过程中的重要事件,如请求处理完成、状态变化等。INFO级别的日志通常用于记录程序的正常运行状态。例如:
   logging.info('This is an info message')

这条日志会记录程序的重要事件,但不会输出调试信息。

  1. WARNING:警告信息,记录可能影响程序正常运行的问题,但不会导致程序崩溃。WARNING级别的日志通常用于记录潜在的问题或需要关注的情况。例如:
   logging.warning('This is a warning message')

这条日志会提醒开发者注意某些潜在的问题,但不会阻止程序继续运行。

  1. ERROR:错误信息,记录程序运行过程中发生的错误,可能导致程序无法正常执行。ERROR级别的日志通常用于记录程序中的异常情况。例如:
   logging.error('This is an error message')

这条日志会记录程序中的错误信息,帮助开发者定位和修复问题。

  1. CRITICAL:严重错误,记录可能导致程序完全崩溃或无法继续运行的严重问题。CRITICAL级别的日志通常用于记录最严重的错误。例如:
   logging.critical('This is a critical message')

这条日志会记录最严重的错误信息,通常需要立即处理。

日志级别的数值表示

每个日志级别都有一个对应的数值,数值越小,表示日志级别越高。具体数值如下:

  • CRITICAL: 50
  • ERROR: 40
  • WARNING: 30
  • INFO: 20
  • DEBUG: 10
  • NOTSET: 0。

日志级别的默认设置

默认情况下,logging模块的日志级别为WARNING,这意味着只有WARNING及以上级别的日志会被输出。如果需要输出更详细的日志,可以通过设置日志级别来调整。例如:

logging.basicConfig(level=logging.DEBUG)

这将日志级别设置为DEBUG,所有级别的日志都会被输出。

日志级别的应用场景

  • DEBUG:适用于开发阶段,帮助开发者了解程序的内部运行情况。
  • INFO:适用于记录程序的正常运行状态,适合生产环境中的日志记录。
  • WARNING:适用于记录潜在的问题或需要关注的情况。
  • ERROR:适用于记录程序中的异常情况。
  • CRITICAL:适用于记录最严重的错误,通常需要立即处理。

通过合理设置日志级别,可以有效地控制日志的输出,帮助开发者更好地管理和分析程序的日志信息。


http://www.kler.cn/a/560475.html

相关文章:

  • css特异性,继承性
  • 最新版IDEA下载安装教程
  • 科普:HTTP端口80和HTTPS端口443
  • 谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇
  • Hadoop--Secondary NameNode工作机制,作用及与NameNode HA的区别
  • Oracle 10g数据库资源下载分享
  • 软件测试高频面试题
  • git上传 项目 把node_modules也上传至仓库了,在文件.gitignore 中忽略node_modules 依然不行
  • 一键提取人声 、伴奏 免费人声、伴奏 音频分离软件分享——UVR5下载安装教程
  • 汽车零部件ERP软件进销存软件库存管理委外加工计算计件工资软件
  • 复用时钟 重映射(Remap)
  • YOLO11改进-模块-引入混合结构模块Mix Structure Block 提高多尺度、小目标
  • VMware 与 CentOS 安装指南
  • IP----访问服务器流程
  • centos系统MBR格式转换成gpt格式 (华为云)
  • 算法-图-数据结构(邻接矩阵)-BFS广度优先遍历
  • 爬虫基础入门之爬取豆瓣电影Top250-Re正则的使用
  • 【初阶数据结构】森林里的树影 “堆” 光:堆
  • GB 44496-2024《汽车软件升级通用技术要求》标准解读|标准结构、测试方法、测试内容
  • 高级SQL技术在Python项目中的应用:ORM与深度性能优化