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

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

前言

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

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 中主要提供了 FileHandlerStreamHandler 两种 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")
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2天前
|
数据采集 小程序 数据库
20年“镇国级”IT大牛,竟搞出500页漫画Python零基础顶级教程!
乔布斯说每个人都应该学习一门编程语言。Python正热,我决定通过编程让自己习得一种思考问题的方式,这也是我在个人编程生涯中的最大收获。 我以为只能枯燥无味地学编程,直到看到本书的样章,以漫画形式让我更直观、生动地了解到什么是编程。超级喜欢这种漫画风格。我回想起自己当年学习编程语言时的情景:逼迫自己背诵和消化、吸收那些自己根本没有理解的内容。如果当时有这么一本书,我就不会学得那么艰难,然后用了那么久才摸索成为一名“攻城狮”。
|
3天前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
22 6
|
3天前
|
存储 算法 索引
深度挖掘:Python并查集背后的秘密,让你的代码逻辑清晰如水晶!
【7月更文挑战第17天】并查集,一种高效处理集合合并与查询的数据结构,常用于图论、社交网络分析等。Python中的实现利用数组存储元素的父节点,通过路径压缩和按秩合并优化查找和合并操作。简单代码示例展示了查找和合并方法,以及应用在检测无向图环路。并查集以其优雅的解决方案在算法世界中闪耀,提升代码的清晰度和效率。
19 5
|
1天前
|
算法 搜索推荐 测试技术
python中算法逻辑错误(Logic Errors)
【7月更文挑战第18天】
7 2
|
6天前
|
网络协议 安全 Shell
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。
|
7天前
|
机器学习/深度学习 API 数据安全/隐私保护
python功能合集
Python功能合集
|
6天前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
21 5
|
4天前
|
算法 测试技术 Python
python中代码逻辑错误
【7月更文挑战第15天】
14 2
|
9天前
|
消息中间件 JSON 自然语言处理
python多进程日志以及分布式日志的实现方式
python日志在多进程环境下的问题 python日志模块logging支持多线程,但是在多进程下写入日志文件容易出现下面的问题: PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。 也就是日志文件被占用的情况,原因是多个进程的文件handler对日志文件进行操作产生的。
|
5天前
|
存储 关系型数据库 数据库
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。
我将提供一个简化的Python代码示例和详解,以展示如何使用Python和Django框架来构建智能化小区综合物业管理系统的一部分功能。