《Python实战进阶》No27: 日志管理:Logging 模块的最佳实践(上)

No27: 日志管理:Logging 模块的最佳实践(上)


摘要

日志记录是软件开发中不可或缺的一部分,尤其是在复杂的生产环境中。Python 的内置 logging 模块提供了强大的工具来管理和记录程序运行中的各种信息。本集将深入探讨 logging 模块的核心概念,包括其基本组成、日志级别、配置文件的使用以及日志轮转技术。通过实战案例,我们将展示如何在 Web 应用中记录访问日志、将日志发送到远程服务器,并分析日志文件以排查问题。最后,我们还将扩展讨论分布式系统中日志集中管理的最佳实践。下集我们将重点聚焦一个复杂案例全面介绍Logging的关键技术。
在这里插入图片描述


核心概念和知识点

1. Logging 模块的基本组成

logging 模块的核心组件包括:

  • Logger: 日志记录器,负责捕获日志消息。
  • Handler: 处理器,指定日志输出的目标(如控制台、文件、远程服务器)。
  • Formatter: 格式化器,定义日志消息的输出格式。
  • Filter: 过滤器,用于对日志消息进行筛选。

2. 日志级别

日志级别从低到高依次为:

  • DEBUG: 调试信息,通常只在开发阶段使用。
  • INFO: 程序正常运行时的信息。
  • WARNING: 表示潜在的问题,但不会影响程序运行。
  • ERROR: 程序运行中出现的错误。
  • CRITICAL: 严重错误,可能导致程序崩溃。

3. 配置文件的使用与动态调整

通过配置文件(如 JSON 或 YAML)可以灵活地管理日志设置,支持动态调整日志级别和输出目标。

4. 日志轮转与存储优化

日志文件可能会迅速增长,导致磁盘空间不足。RotatingFileHandlerTimedRotatingFileHandler 提供了日志轮转功能,可按大小或时间分割日志文件。


实战案例

案例 1:记录 Web 应用的访问日志

假设我们有一个简单的 Flask Web 应用,记录每次请求的 URL 和响应状态码。

代码实现
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask, requestapp = Flask(__name__)# 配置日志
def setup_logger():logger = logging.getLogger('web_logger')logger.setLevel(logging.INFO)# 创建文件处理器,限制日志文件大小为 1MB,保留 5 个备份handler = RotatingFileHandler('access.log', maxBytes=1024 * 1024, backupCount=5)handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))logger.addHandler(handler)return loggerlogger = setup_logger()@app.route('/')
def home():logger.info(f"Request: {request.method} {request.url} - Status: 200")return "Welcome to the Home Page!"if __name__ == '__main__':app.run(debug=False)
输入与输出
  • 启动应用:
    python app.py
    
  • 访问主页:
    打开浏览器访问 http://127.0.0.1:5000/
  • 生成的日志文件 (access.log):
    2023-10-01 10:00:00 - INFO - Request: GET http://127.0.0.1:5000/ - Status: 200
    

案例 2:将日志发送到远程服务器

我们可以使用 SocketHandler 将日志发送到远程服务器,例如 ELK Stack。

代码实现
import logging
import logging.handlersdef setup_remote_logger():logger = logging.getLogger('remote_logger')logger.setLevel(logging.ERROR)# 创建 SocketHandler,将日志发送到远程服务器socket_handler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')socket_handler.setFormatter(formatter)logger.addHandler(socket_handler)return loggerlogger = setup_remote_logger()# 模拟错误日志
try:1 / 0
except ZeroDivisionError as e:logger.error("An error occurred: %s", str(e))
输入与输出
  • 启动远程日志服务器 (ELK Stack 示例):
    使用 Docker 启动 ELK Stack。
    docker-compose up
    
  • 运行代码:
    python remote_logger.py
    
  • ELK 中查看日志:
    在 Kibana 中可以看到类似以下日志:
    2023-10-01 10:10:00 - remote_logger - ERROR - An error occurred: division by zero
    

案例 3:分析日志文件以排查问题

我们可以使用 Python 分析日志文件,统计错误日志的数量。

代码实现
import redef analyze_log(file_path):error_count = 0with open(file_path, 'r') as file:for line in file:if re.search(r'ERROR', line):error_count += 1return error_countif __name__ == '__main__':log_file = 'access.log'errors = analyze_log(log_file)print(f"Total ERROR logs: {errors}")
输入与输出
  • 日志文件内容 (access.log):
    2023-10-01 10:00:00 - INFO - Request: GET http://127.0.0.1:5000/ - Status: 200
    2023-10-01 10:05:00 - ERROR - Division by zero
    
  • 运行代码:
    python analyze_log.py
    
  • 输出:
    Total ERROR logs: 1
    

总结

通过本集的学习,我们掌握了 logging 模块的核心概念和最佳实践,包括日志级别的使用、日志轮转技术以及如何将日志发送到远程服务器。这些技能在实际开发中非常实用,能够帮助我们更好地管理和分析程序运行中的日志信息。


扩展思考

1. 如何在分布式系统中实现日志的集中管理?

在分布式系统中,推荐使用集中式日志管理工具,如 ELK Stack(Elasticsearch + Logstash + Kibana)或 Fluentd。所有节点的日志可以通过网络发送到中央日志服务器,便于统一管理和分析。

2. 探讨日志分析工具的应用场景

  • Logstash: 用于日志收集、解析和传输。
  • Grafana: 结合 Prometheus 或 Elasticsearch,提供可视化分析界面。
  • Graylog: 开源日志管理平台,适合中小型企业。

通过结合这些工具,可以构建高效的日志管理系统,满足复杂场景下的需求。


希望本集内容能帮助你在项目中更高效地使用 logging 模块!如果有任何问题或建议,欢迎在评论区留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36379.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日Attention学习27——Patch-based Graph Reasoning

模块出处 [NC 25] [link] Graph-based context learning network for infrared small target detection 模块名称 Patch-based Graph Reasoning (PGR) 模块结构 模块特点 使用图结构更好的捕捉特征的全局上下文将图结构与特征切片(Patching)相结合,从而促进全局/…

ospf动态路由

一、为什么使用动态路由 OSPF(open shortest path first开放最短路径优先)是内部网关协议(IGP)的一种,基于链路状态算法(LS)。 OSPF企业级路由协议(RFC2328 OSPFv2),核心重点协议 OSPF共三个版本,OSPFV1主要是实验室…

记一次服务器中木马导致cpu占用高的问题

最近准备搭建一个个人博客,发现才放了一个nginx和一个很简单的java后台cpu占用率就居高不下,然后用top命令查看果然有问题 其中这个networkservice 和sysupdate占用很高,原本还以为是系统相关的进程,但是想想如果是系统相关的进程…

基于LabVIEW的Windows平台高速闭环控制

在Windows系统下,通过LabVIEW实现高速闭环控制面临两大核心挑战:非实时操作系统的调度延迟与硬件接口的传输速度限制。以USB-6351(NI USB-6351 DAQ卡)为例,其理论采样率可达1.25 MS/s(单通道)&a…

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

【C语言】自定义类型:结构体

一、结构体类型的声明 我们前面学习操作符的时候已经接触过结构体了,下面我们回顾一下结构体的基本内容。 创建结构体的语法如上所示: struct是创建结构体的关键字,然后tag就是我们结构体的名称,member-list是结构体的成员列表&…

python基本运用:类的介绍和使用

一、介绍类 类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例 实例化:创建一个类的实例,类的具体对象。 对象:通过类定义的数据结构实例。对象包括两个数据成员&#x…

Elasticsearch:使用 ColPali 进行复杂文档搜索 - 第 1 部分 - 8.18

作者:来自 Elastic Peter Straer 及 Benjamin Trent 这篇文章介绍了 ColPali 模型,这是一种 late-interaction 模型,可简化包含图片和表格的复杂文档搜索过程,并讨论了其在 Elasticsearch 中的实现。 在构建搜索应用时&#xff0c…

2025-03-19 学习记录--C/C++-C 库函数 - qsort() 实现快速排序

C 库函数 - qsort() 实现快速排序 ⭐️ C 标准库 - <stdlib.h> &#xff08;一&#xff09;、命名介绍 &#x1f36d; qsort 是 C 标准库&#xff08;stdlib.h&#xff09;中提供的一个快速排序函数&#xff0c;用于对数组进行排序。❀它的名字来源于 “Quick Sort”&…

04 泛型编程

1、概论 编程范式&#xff1a;面向过程编程、面向对象编程、泛型编程。 泛型编程&#xff1a;目的是编写能够适合多种数据类型的代码&#xff0c;而不是为每种特定的数据类型编写重复的代码。 模板是实现泛型的主要工具&#xff0c;主要分为函数模板和类模板。 函数模板&am…

【MySQL】架构

MySQL架构 和其它数据库相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上&#xff0c;插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实…

(保姆级教程)CAN总线—如何使用CANoe(VN1640)的Scaner功能测量样件的波特率

1、如何找到测试入口 &#xff08;步骤1&#xff09;前置条件 连接好被测样件和VN1640&#xff0c;连接电源。 &#xff08;2&#xff09;打开CANoe工程&#xff0c;依次点击Hardware--》NetworkHardware&#xff0c;如下图&#xff1a; &#xff08;3&#xff09;单击Netwo…

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化 家庭自动化一直是我们大多数人的灵感来源。从我们舒适的椅子或任何房间的床上切换交流负载,而无需伸手去触碰另一个房间的开关,听起来很酷,不是吗!.现在,在物联网时代,多亏了 ESP8266 模块,它使从世界…

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…

Excel Script Lab学习笔记

注意 The Excel JavaScript API 没有“Cell”对象或类。 相反&#xff0c;Excel JavaScript API 将所有 Excel 单元格定义为 Range 对象。 Excel UI 中的单个单元格转换为 Excel JavaScript API 中包含一个单元格的 Range 对象。 单个 Range 对象也可以包含多个连续的单元格。…

【第14节】windows sdk编程:进程与线程介绍

目录 一、进程与线程概述 1.1 进程查看 1.2 何为进程 1.3 进程的创建 1.4 进程创建实例 1.5 线程查看 1.6 何为线程 1.7 线程的创建 1.8 线程函数 1.9 线程实例 二、内核对象 2.1 何为内核对象 2.2 内核对象的公共特点 2.3 内核对象句柄 2.4 内核对象的跨进程访…

数据结构中的引用管理对象体系

数据结构中的引用管理对象体系 &#xff08;注&#xff1a;似复刻变量即实例对象&#xff09; 引用管理对象的&#xff0c;有引用就能管理到它所指向的对象&#xff0c;我们拿引用最终的目的就是管理那些我们需要管理的最终直接对象&#xff0c;引用也是对象&#xff0c;同时…

Java 异常处理

一、引言 在 Java 编程中,异常处理是一个至关重要的部分。程序在运行过程中可能会遇到各种意外情况,如文件不存在、网络连接中断、数组越界等。如果不进行适当的处理,这些异常可能会导致程序崩溃,影响用户体验。Java 提供了一套完善的异常处理机制,允许开发者捕获和处理这…

数据驱动进化:AI Agent如何重构手机交互范式?

如果说AIGC拉开了内容生成的序幕&#xff0c;那么AI Agent则标志着AI从“工具”向“助手”的跨越式进化。它不再是简单的问答机器&#xff0c;而是一个能够感知环境、规划任务并自主执行的智能体&#xff0c;更像是虚拟世界中的“全能员工”。 正如行业所热议的&#xff1a;“大…

skywalking微服务链路追踪

是什么&#xff1f; skywalking是一个优秀的国产开源框架&#xff0c;2015年由个人吴晟&#xff08;华为开发者&#xff09;开源 &#xff0c; 分布式链路追踪就是将一次分布式请求还原成调用链路&#xff0c;将一次分布式请求的调用情况集中展示&#xff0c;比如各个服务节点…