Python 教程:日志功能与处理逻辑

简介: 在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能。在 Python 语言中,有个內建模块 logging 能够很好的实现日志功能。整体来说,`logging` 配置可以分成 4 个部分: `Loggers`、`Handlers`、`Filters` 和 `Formatters`。接下来我们详细探讨其处理逻辑和配置方法。

前言

在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能。在 Python 语言中,有个內建模块 logging 能够很好的实现日志功能。整体来说,logging 配置可以分成 4 个部分: Loggers、Handlers、Filters 和 Formatters。接下来我们详细探讨其处理逻辑和配置方法。

1. 日志功能逻辑

LogRecord

每个事件生成日志条目称之为 LogRecord,在 LogRecord 中包含了日志级别,日志元数据信息两个重要组成部分。在 Python 语言中日志级别可以分为 5 个等级:

  • DEBUG: Low level system information for debugging purposes.
  • INFO: General system information.
  • WARNING: Information describing a minor problem that has occurred.
  • ERROR: Information describing a major problem that has occurred.
  • CRITICAL: Information describing a critical problem that has occurred. 当 LogRecord 传入 Logger 中处理时,会比较 LogRecord 和 Logger 中的日志级别。若日志级别相等或者高于 Logger 的日志级别,该条 LogRecord 才会被 Logger 处理。

Formatter

Formatter 主要用于渲染日志的输出格式,在 Python 中给定了内置的格式变量,我们可以自定义日志信息的输出格式。

格式变量列举:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

Filter

Filter 用来为日志信息的处理提供额外的过滤选项。在默认情况下,从 Logger 获取到的每一条 LogRecord 都会交给 Handler 处理。但是,当我们有一些额外的处理逻辑,比方说我希望将 LogRecord 的日志级别变更,或者我希望后续仅处理 ERROR 类型的记录,那么就可以使用 Filter 来过滤。

Handler

Handler 是日志处理的核心,描述了程序日志的后续执行方式。一般而言,我们希望日志能够输出到 Console 显示,或者写成文件本地持久化存储,都要靠 Handler 来实现。为此,Python 中主要提供了 FileHandler 和 StreamHandler 两种 Handler 来分别执行文件存储和控制台打印两种日志处理方式。

2. 函数式配置日志

函数式配置日志输出是最简单的方式,我们可以将日志打印到文件中。但是,这种方式有个缺陷,即无法将日志打印到 Console。 特点:配置简单,但无法同时输出控制台和文件

import logging
logging.basicConfig(
    level=logging.DEBUG, # 设定打印日志的级别
    # 日志消息格式,level=日志级别 format=日志格式 asctime=对应下面的datefmt filename=日志文件路径
    format="%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s",
    datefmt="%Y-%d-%d %H:%M:%S",
    filename="1.log",
    # a=追加 w=覆盖
    filemode="a"
)
logging.debug("debug")
logging.info("info")

3. 对象式配置日志

对象式配置日志能够较强的进行定制化配置,包括日志的输出格式、控制台输出、输出本地文件持久化存储。因此,在实际使用时一般都采用对象式配置日志的方式来处理。 特点:定制化强,配置较为复杂

配置流程

  1. 创建并获取 logger 对象;
  2. 创建 FileHandler 对象;
  3. 创建 StreamHandler 对象;
  4. 创建 Formatter 对象;
  5. 给 Handler 对象绑定 Formatter;
  6. 给 logger 对象绑定 Handler

import logging
logger = logging.RootLogger("DEBUG") # 如果要自定义level,则可使用RootLogger,或者logger.setLevel()
# logger = logging.getLogger() # 使用getLogger默认level为WARNING
fh = logging.FileHandler('test.log', encoding='utf-8')  # 创建FileHandler对象
sh = logging.StreamHandler()  # 创建StreamHandler对象

fmt = logging.Formatter("%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s")
fh.setFormatter(fmt)  # 给Handler对象绑定Formatter
sh.setFormatter(fmt)  # 给Handler对象绑定Formatter

logger.addHandler(fh)  # 给logger对象绑定Handler
logger.addHandler(sh) # 给logger对象绑定Handler

logger.info('info')
logger.debug('debug')
logger.error("error")
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
1052 0
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
459 101
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
388 99
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
717 98
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
消息中间件 Java Kafka
搭建ELK日志收集,保姆级教程
本文介绍了分布式日志采集的背景及ELK与Kafka的整合应用。传统多服务器环境下,日志查询效率低下,因此需要集中化日志管理。ELK(Elasticsearch、Logstash、Kibana)应运而生,但单独使用ELK在性能上存在瓶颈,故结合Kafka实现高效的日志采集与处理。文章还详细讲解了基于Docker Compose构建ELK+Kafka环境的方法、验证步骤,以及如何在Spring Boot项目中整合ELK+Kafka,并通过Logback配置实现日志的采集与展示。
1553 64
搭建ELK日志收集,保姆级教程
|
JSON 数据格式 开发者
Python 3.10 结构模式匹配:简化条件逻辑的利器
Python 3.10 结构模式匹配:简化条件逻辑的利器
478 91
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
1277 19
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
638 1
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
2081 5

推荐镜像

更多