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

Python日志系统设计:从基础到企业级实践

Python日志系统设计从基础到企业级实践引言日志系统是后端应用的重要组成部分它记录系统运行状态、帮助排查问题、追踪用户行为。Python的logging模块提供了强大的日志功能但在实际应用中需要合理设计才能发挥最大价值。本文将深入探讨Python日志系统的设计原则、最佳实践和企业级解决方案。一、日志系统基础1.1 基本配置import logging # 基本配置 logging.basicConfig( levellogging.DEBUG, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(app.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) logger.debug(这是debug级别日志) logger.info(这是info级别日志) logger.warning(这是warning级别日志) logger.error(这是error级别日志) logger.critical(这是critical级别日志)1.2 日志级别# 日志级别从低到高 # DEBUG: 详细信息用于调试 # INFO: 一般信息确认系统正常运行 # WARNING: 警告信息可能的问题 # ERROR: 错误信息功能无法正常执行 # CRITICAL: 严重错误系统可能无法继续运行 # 设置不同级别的日志 logging.basicConfig(levellogging.WARNING) logger logging.getLogger(example) logger.debug(不会输出) logger.info(不会输出) logger.warning(会输出) logger.error(会输出) logger.critical(会输出)二、结构化日志2.1 使用JSON格式import logging import json from pythonjsonlogger import jsonlogger logger logging.getLogger(json_logger) logger.setLevel(logging.DEBUG) handler logging.StreamHandler() formatter jsonlogger.JsonFormatter( %(asctime)s %(levelname)s %(name)s %(message)s ) handler.setFormatter(formatter) logger.addHandler(handler) logger.info(User login, extra{user_id: 123, ip: 192.168.1.1})2.2 自定义日志记录器import logging from datetime import datetime class StructuredLogger: def __init__(self, name): self.logger logging.getLogger(name) def log(self, level, message, **kwargs): extra { timestamp: datetime.utcnow().isoformat(), **kwargs } self.logger.log(level, message, extraextra) def info(self, message, **kwargs): self.log(logging.INFO, message, **kwargs) def error(self, message, **kwargs): self.log(logging.ERROR, message, **kwargs) # 使用 logger StructuredLogger(app) logger.info(Order created, order_id123, user_id456, amount99.99)三、日志系统架构3.1 分层日志记录# 模块级别的日志配置 logger logging.getLogger(__name__) def process_data(data): logger.debug(fProcessing data: {data}) try: result transform(data) logger.info(fData processed successfully) return result except Exception as e: logger.error(fFailed to process data: {e}, exc_infoTrue) raise def transform(data): logger.debug(fTransforming data) # ... 处理逻辑3.2 日志处理器链import logging # 创建根日志器 root_logger logging.getLogger() root_logger.setLevel(logging.DEBUG) # 创建多个处理器 console_handler logging.StreamHandler() console_handler.setLevel(logging.INFO) file_handler logging.FileHandler(app.log) file_handler.setLevel(logging.DEBUG) # 创建格式化器 formatter logging.Formatter( %(asctime)s - %(name)s - %(levelname)s - %(message)s ) console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 添加处理器 root_logger.addHandler(console_handler) root_logger.addHandler(file_handler)四、日志轮转与管理4.1 文件轮转配置from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler # 基于大小轮转 rotating_handler RotatingFileHandler( app.log, maxBytes1024 * 1024 * 5, # 5MB backupCount5, # 保留5个备份 encodingutf-8 ) # 基于时间轮转 timed_handler TimedRotatingFileHandler( app.log, whenmidnight, # 每天午夜轮转 interval1, # 间隔1天 backupCount7, # 保留7天 encodingutf-8 )4.2 日志清理策略import os import glob import time def clean_old_logs(log_dir, days_to_keep30): 清理指定天数前的日志文件 cutoff_time time.time() - (days_to_keep * 24 * 60 * 60) for log_file in glob.glob(os.path.join(log_dir, *.log*)): if os.path.getmtime(log_file) cutoff_time: os.remove(log_file) print(fRemoved old log: {log_file}) # 使用 clean_old_logs(/var/log/myapp, days_to_keep7)五、日志最佳实践5.1 日志命名规范# 正确的日志命名 logger logging.getLogger(__name__) # 错误的日志命名 # logger logging.getLogger(my_logger) # 无法追踪来源 # 模块级别命名示例 # 在 module/submodule.py 中 logger logging.getLogger(__name__) # - module.submodule5.2 日志消息格式# 好的日志消息 logger.info(User %s logged in from %s, user_id, ip_address) # 避免的格式 logger.info(fUser {user_id} logged in from {ip_address}) # 会提前格式化 # 参数化日志 logger.error( Failed to process order %d: %s, order_id, str(error), exc_infoTrue )5.3 异常日志记录try: process_order(order) except ValueError as e: logger.warning(Invalid order: %s, e) except DatabaseError as e: logger.error(Database error processing order %d, order.id, exc_infoTrue) except Exception as e: logger.critical(Unexpected error, exc_infoTrue) raise六、日志监控与分析6.1 日志指标收集from collections import defaultdict import time class LogMetrics: def __init__(self): self.counter defaultdict(int) self.start_time time.time() def record(self, level, message): self.counter[level] 1 def get_report(self): elapsed time.time() - self.start_time return { uptime: elapsed, counts: dict(self.counter), rate: sum(self.counter.values()) / elapsed if elapsed 0 else 0 } # 使用 metrics LogMetrics() # 在日志处理器中调用 metrics.record(level, message)6.2 日志聚合与告警def check_log_alerts(log_file): 检查日志中的异常模式 error_count 0 with open(log_file, r) as f: for line in f: if ERROR in line or CRITICAL in line: error_count 1 if error_count 100: send_alert(fHigh error rate detected: {error_count} errors) def send_alert(message): 发送告警通知 # 实现告警逻辑邮件、短信、Slack等 print(fALERT: {message})七、企业级日志系统7.1 集中式日志收集import logging from pythonjsonlogger import jsonlogger import graypy # 配置Graylog处理器 handler graypy.GELFUDPHandler(graylog.example.com, 12201) formatter jsonlogger.JsonFormatter() handler.setFormatter(formatter) logger logging.getLogger(app) logger.addHandler(handler) logger.setLevel(logging.INFO) # 使用 logger.info(User login, extra{user_id: 123})7.2 ELK Stack集成import logging from elasticsearch import Elasticsearch from elasticsearch_logger import ElasticsearchHandler # 配置Elasticsearch处理器 es Elasticsearch([http://elasticsearch:9200]) handler ElasticsearchHandler(es, index_nameapp-logs) logger logging.getLogger(app) logger.addHandler(handler) logger.setLevel(logging.INFO)八、总结日志系统设计的关键要点分级管理根据级别过滤日志结构化使用JSON格式便于分析持久化配置日志轮转和清理监控告警及时发现问题集中收集便于统一分析在实际项目中建议使用结构化日志格式配置适当的日志级别实现日志轮转策略集成集中式日志系统添加日志监控和告警思考在你的项目中日志系统遇到过哪些挑战欢迎分享

相关文章:

Python日志系统设计:从基础到企业级实践

Python日志系统设计:从基础到企业级实践 引言 日志系统是后端应用的重要组成部分,它记录系统运行状态、帮助排查问题、追踪用户行为。Python的logging模块提供了强大的日志功能,但在实际应用中需要合理设计才能发挥最大价值。 本文将深入探讨…...

基于Vue 3与JSON数据构建MBTI运势生成器:前端实战开发指南

1. 项目概述:当MBTI遇上运势,一个技术驱动的趣味应用最近在GitHub上看到一个挺有意思的项目,叫“mbti-fortune”,作者是leilei926524-tech。光看名字,你可能会觉得这又是一个简单的星座运势或者性格测试的变种。但作为…...

HarmonyOS 6.0 跨端页面构建实践:从 UI 代码到热力交互卡片设计

HarmonyOS 6.0 跨端页面构建实践:从 UI 代码到热力交互卡片设计 前言 在 HarmonyOS 6.0 的跨端开发体系中,页面构建的核心目标已经从“能运行”逐步转向“高一致性体验 低成本跨端复用”。尤其是在多设备协同的场景下,一个 UI 组件不仅要适配…...

基于 Harmony6.0 的城市空气质量监测页面开发实践:ArkUI 页面构建与跨端能力深度解析

基于 Harmony6.0 的城市空气质量监测页面开发实践:ArkUI 页面构建与跨端能力深度解析 前言 随着 HarmonyOS NEXT 与 Harmony6.0 的持续演进,鸿蒙生态已经不再只是“多设备互联”这么简单,而是逐渐形成了一套完整的分布式应用开发体系。相比传…...

DISTINCT 带 WHERE 仍全表扫描?两层优化刀法拆解

DISTINCT 带 WHERE 仍全表扫描?两层优化刀法拆解 引言:一个看似多余的 DISTINCT,藏着性能陷阱 几乎每个写过 SQL 的人都用过 DISTINCT。它的语义很简单——去掉重复行。但"简单"不等于"快"。在一个客户的生产环境中&…...

从混淆矩阵到mIOU:手把手解析语义分割核心评价指标

1. 从像素战场到成绩单:理解混淆矩阵 第一次接触语义分割任务时,我盯着那些五彩斑斓的分割图直发懵——怎么判断这个模型到底好不好?直到导师扔给我一张"混淆矩阵"的表格,才恍然大悟这就像学生时代的考试成绩单。想象你…...

PCI、PCIe与InfiniBand接口技术对比与应用解析

1. 计算机接口技术演进背景在服务器和PC硬件架构中,I/O接口技术始终是决定系统性能的关键因素之一。作为从业15年的系统架构师,我见证了从传统PCI总线到现代高速互连技术的完整演进历程。这种演进并非简单的替代关系,而是针对不同应用场景的技…...

离线式SMPS输入整流器设计与优化指南

1. 离线式SMPS输入整流器设计基础开关电源(SMPS)的输入整流环节如同电力系统的"第一道闸门",其设计质量直接影响后续DC-DC转换环节的稳定性。在离线式设计中,整流器需要将85-265VAC的宽范围交流输入转换为高压直流,这个看似简单的过…...

openwrt--by--myself

1. 完全清理配置make distclean // 清理所有配置make clean:最基础的清理,仅删除编译生成的固件、内核和软件包等产物(即 bin/ 和 build_dir/ 目录)。make dirclean:在 clean 的基础上,还会清除交叉编译工…...

《Java 100 天进阶之路》第1篇:编程语言类型有哪些?我心中的TOP1编程语言,什么是Java跨平台性?

第1篇:编程语言类型有哪些?我心中的TOP1编程语言,什么是Java跨平台性? 一、核心知识点 编程语言的三大类型:机器语言、汇编语言、高级语言Java为什么是“一次编写,到处运行”(跨平台原理&…...

Java基础——抽象类与接口

前言: 在Java面向对象编程中,抽象类,接口,内部类以及Object类是构建灵活,可拓展代码的核心工具。理解它们的区别与联系,掌握使用场景,是每一位Java开发者进阶的必经之路。 本文将结合通俗易懂的…...

目标检测算法——史上最全遥感数据集汇总附下载链接【速速收藏】

🚀🚀🚀 近期,小海带在空闲之余收集整理了一批遥感检测数据集供大家参考。 整理不易,小伙伴们记得一键三连喔!!!🎈 🖥️ 专注开源数据集分享与深度学习科研思路…...

链表专项(二):链表反转、环判断

大家好,欢迎来到《算法面试60讲(2026最新版全真题带解析)》的第10篇内容!上一篇我们掌握了单链表、双链表的增删改查基础操作,本节课将聚焦链表专项的核心难点——链表反转和环判断,这两个考点是大厂面试中链表部分的“高频必考题”,无论是校招还是社招,几乎都会出现,…...

SecureVault - 基于新范式的Windows文件加密工具

前言作为一个常年和各种文件打交道的普通人,我一直有个困扰:现有的加密工具要么太复杂,要么太贵,要么用的都是几十年的老算法。我想,能不能做一款简单、便宜、但加密方式完全不同的新工具?于是就有了 Secur…...

Claude代码自动模式:跳过权限的更安全方式 Claude Code auto mode: a safer way to skip permissions —— Anthropic

Claude Code auto mode: a safer way to skip permissions Claude代码自动模式:跳过权限的更安全方式 https://www.anthropic.com/engineering/claude-code-auto-mode Claude Code users approve 93% of permission prompts. We built classifiers to automate so…...

鸿蒙与 H5 通信使用的方法及原理

鸿蒙(HarmonyOS)与 H5 的通信主要通过 ‌Web 组件(WebView)‌ 实现,支持多种机制以满足不同场景需求。‌一、通信方法‌‌1. runJavaScript() 方法(原生 → H5)‌鸿蒙原生侧通过 WebviewControl…...

第三篇:变量

一.变量 1.变量的创建 (1)语法格式:data_type name; 补充:其中“data_type"是数据类型,”name"是变量名,变量名根据需求随意取即可,但尽量取得有意义 例如:int age 10;(创…...

Obsidian 坚果云同步最佳实践:Nutstore Sync 大仓库提速、冲突策略、.obsidian配置同步与恢复方案

适用人群:Obsidian 重度用户(上千/上万文件、图片/附件多、跨设备高频编辑、对稳定性与可恢复性要求高)。 强烈建议:操作前先把整个 Vault 复制一份做离线备份。 1. 你要解决的不是“能不能同步”,而是“同步体系” 重…...

Java数据结构6(队列和二叉树初步)

目录1,队列的性质2,循环队列3,队列链式存储4,树的性质5,二叉树的遍历6,代码实现一,队列的性质同样是线性表,队列有线性表的相关操作,不过不同的是队列的性质为先进先出&a…...

Pikachu 靶场 XSS 通关笔记:从反射型到盲打与过滤绕过

目录 一、基础 XSS 类型 1. 反射型 XSS (GET)2. 反射型 XSS (POST)3. 存储型 XSS4. DOM 型 XSS5. DOM 型 XSS-x 二、进阶 XSS 场景 6. XSS 之盲打 (Blind XSS)7. XSS 之过滤8. XSS 之 htmlspecialchars9. XSS 之 href 输出10. XSS 之 JS 输出 三、XSS 绕过速查表 四、Pikach…...

别再用Excel硬扛了!SPSS数据视图和变量视图保姆级上手指南

别再用Excel硬扛了!SPSS数据视图和变量视图保姆级上手指南 第一次打开SPSS时,很多从Excel转过来的用户会愣住——这个界面怎么既熟悉又陌生?左边明明也是表格,但为什么右键菜单里找不到"设置单元格格式"?右上…...

基于PSCAD的光伏-火电打捆直流送出系统建模与扰动特性仿真研究

基于PSCAD的光伏-火电打捆直流送出系统建模与扰动特性仿真研究 摘要 随着我国“双碳”目标的深入推进,以光伏为代表的新能源发电装机规模持续快速增长。然而,光伏发电具有间歇性和波动性特征,大规模并网对电力系统的安全稳定运行提出了严峻挑战。将光伏与火电打捆经高压直…...

C语言中的数据类型存储

1、二进制和进制转换我们经常能听到 2 进制、 8 进制、 10 进制、 16 进制 这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。⽐如:数值15的各种进制的表⽰形式(十六进制的数值之前写:0x &a…...

DAY 4.链表中环的入口节点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、链表中环的入口节点二、代码实现2.结论总结前言 一、链表中环的入口节点 思路:使用快慢指针,都从头节点出发,快指针一次…...

PX4 Firmware V1.14.4 开源支持

PX4 官方固件版本迭代迅猛,这往往导致开发者在硬件兼容性、环境搭建及软件依赖性上遭遇重重挑战。为彻底解决这一问题,Kerloud 推出固件与文档长期支持(LTS)计划。我们将对飞控固件代码、技术文档及参数调优指南实施持续性维护&am…...

渗透测试技巧(七)| 系统提权

系统提权基础 实战过程中,你通过漏洞(上传漏洞、弱口令、Web 漏洞)打进服务器,一般只能对应应用服务的账户权限。这个权限常常属于低权限账户,无法查看账号密码、配置系统文件、获取敏感数据等,这时就需要提权!提权就是把低权限账号升级为系统最高权限,从而完全控制服…...

SITS2026正式发布倒计时72小时:这4类AI研发团队已紧急升级知识治理体系,你还在用Wiki+钉钉硬扛?

更多请点击: https://intelliparadigm.com 第一章:AI研发知识管理:SITS2026专题 核心挑战与范式演进 AI研发正从单点模型训练转向全生命周期知识协同——SITS2026(Semantic Intelligence & Traceable Systems 2026&#xf…...

基于MCP协议的智能文档处理工具simdoc-mcp:从RAG原理到Claude集成实战

1. 项目概述:从“文档理解”到“智能交互”的范式跃迁最近在折腾一个挺有意思的开源项目,叫simdoc-mcp。乍一看这个名字,可能有点摸不着头脑,svd-ai-lab是背后的团队,simdoc是核心,mcp是关键协议。简单来说…...

Navicat Mac版无限重置试用期的终极指南:3种简单方法破解14天限制

Navicat Mac版无限重置试用期的终极指南:3种简单方法破解14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac …...

SharpKeys:免费Windows键盘重映射终极解决方案

SharpKeys:免费Windows键盘重映射终极解决方案 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys SharpKey…...