网站网络优化外包外贸营销渠道

张小明 2026/1/11 4:06:24
网站网络优化外包,外贸营销渠道,海淀网站开发的公司,网页版微信登录手机会显示吗《别再用 print 打日志了#xff1a;深入理解 Python logging 的底层原理与最佳实践》 在我这些年教授 Python、带团队做项目、审查代码的过程中#xff0c;“日志”是我最常看到被忽视、却又最容易暴露开发者水平的部分。尤其是初学者#xff0c;几乎都会经历一个阶段…《别再用 print 打日志了深入理解 Python logging 的底层原理与最佳实践》在我这些年教授 Python、带团队做项目、审查代码的过程中“日志”是我最常看到被忽视、却又最容易暴露开发者水平的部分。尤其是初学者几乎都会经历一个阶段用 print() 打天下。调试用 print排查问题用 print甚至线上环境也用 print。但随着项目规模扩大、团队协作加深、系统复杂度提升你会发现print 是玩具logging 才是生产力工具。这篇文章我会从基础到高级从原理到实践带你彻底理解为什么 print 不适合作为日志工具logging 模块到底做了哪些 print 做不到的事logging 的底层架构与运行机制如何在真实项目中构建专业、可扩展、可维护的日志体系常见坑与最佳实践无论你是刚入门 Python 的新手还是正在带团队的资深开发者这篇文章都能帮你建立起对“日志系统”的正确认知。一、为什么 print 不适合打日志很多人第一次听到“不要用 print 打日志”时第一反应是print 不就是输出信息吗我调试的时候用得好好的为什么不能用下面我们从工程角度逐条拆解。1. print 没有日志等级Log Level在真实项目中你需要区分DEBUG调试信息INFO正常运行信息WARNING潜在问题ERROR错误但程序还能继续CRITICAL致命错误print 只有一种输出方式无法表达语义。而 logginglogging.debug(调试信息)logging.info(正常信息)logging.warning(警告)logging.error(错误)logging.critical(严重错误)日志等级不仅是“分类”更是“过滤器”。你可以在开发环境输出 DEBUG在生产环境只输出 WARNING 以上。print 做不到。2. print 无法控制输出位置print 只能输出到 stdout。但真实项目需要输出到控制台输出到文件输出到多个文件输出到远程日志服务器输出到 ELK / Loki / Splunk输出到邮件、钉钉、企业微信logging 可以通过 Handler 灵活配置logging.FileHandler(app.log)logging.StreamHandler()logging.handlers.RotatingFileHandler()logging.handlers.SMTPHandler()print 做不到。3. print 无法格式化日志结构生产级日志必须包含时间戳日志等级模块名行号线程/进程 ID消息内容logging 可以通过 Formatter 完成%(asctime)s - %(levelname)s - %(name)s - %(message)sprint 做不到。4. print 无法进行日志轮转Log Rotation线上日志不能无限增长否则占满磁盘导致服务崩溃无法归档分析logging 提供RotatingFileHandler按大小轮转TimedRotatingFileHandler按时间轮转print 做不到。5. print 无法做到线程安全 / 进程安全多线程、多进程环境下print 输出会互相覆盖、交错。logging 内部使用锁机制保证线程安全。print 做不到。6. print 无法统一管理、无法动态调整你无法做到某个模块单独调高日志等级某个模块单独输出到文件某个模块关闭日志logging 可以通过 Logger 层级结构实现。print 做不到。总结一句话print 是调试工具logging 才是日志系统。二、logging 模块到底做了什么底层架构解析很多人用 logging 只是停留在importlogging logging.basicConfig(...)logging.info(hello)但 logging 的底层架构其实非常优雅甚至可以说是“工程美学”的典范。logging 的四大核心组件Python logging 模块由四个核心对象组成组件作用Logger日志入口负责接收日志请求Handler决定日志输出到哪里Formatter决定日志长什么样Filter决定哪些日志能通过它们的关系如下Logger → Handler → Formatter ↑ Filter1. Logger日志入口每个模块通常会创建自己的 loggerloggerlogging.getLogger(__name__)Logger 有层级结构root ├── app │ ├── app.db │ ├── app.api │ └── app.utils子 logger 会继承父 logger 的 Handler。这意味着你可以为某个模块单独配置日志也可以统一管理整个项目的日志print 完全没有这种能力。2. Handler日志输出位置常见 HandlerStreamHandler控制台FileHandler文件RotatingFileHandler按大小轮转TimedRotatingFileHandler按时间轮转SMTPHandler邮件HTTPHandler发送到 HTTP 服务SocketHandler发送到远程日志服务器你可以给一个 Logger 配置多个 Handlerlogger.addHandler(console_handler)logger.addHandler(file_handler)print 只能输出到 stdout。3. Formatter日志格式你可以自定义日志格式formatterlogging.Formatter(%(asctime)s - %(levelname)s - %(name)s - %(message)s)甚至可以输出 JSONformatterlogging.Formatter({time: %(asctime)s, level: %(levelname)s, msg: %(message)s})这对接 ELK、Loki 非常重要。4. Filter日志过滤器你可以过滤某个模块的日志某个等级的日志某个关键字的日志例如classKeywordFilter(logging.Filter):deffilter(self,record):return支付inrecord.msgprint 完全做不到。三、logging 的底层实现机制你可能第一次看到下面我们深入一点看看 logging 是如何工作的。1. Logger.log() 的执行流程当你调用logger.info(hello)logging 内部会执行Logger.info() ↓ Logger._log() ↓ 创建 LogRecord 对象 ↓ Logger.handle() ↓ Logger.callHandlers() ↓ Handler.handle() ↓ Handler.emit()其中最关键的是LogRecord 对象它包含消息内容日志等级文件名行号函数名线程 ID进程 ID时间戳print 只有字符串。2. Handler.emit() 是真正输出日志的地方不同 Handler 的 emit() 不同StreamHandler.emit() → 输出到 stdoutFileHandler.emit() → 写入文件RotatingFileHandler.emit() → 判断文件大小并轮转TimedRotatingFileHandler.emit() → 判断时间并轮转这就是 logging 能扩展的原因。3. logging 是线程安全的Handler 内部使用了锁self.lock.acquire()try:stream.write(msg)finally:self.lock.release()print 没有锁。四、如何构建一个专业的日志系统实战案例下面我给你一个真实项目中常用的日志配置方案。1. 日志配置文件logging.conf[loggers] keysroot,app [handlers] keysconsoleHandler,fileHandler [formatters] keyssimpleFormatter [logger_root] levelWARNING handlersconsoleHandler [logger_app] levelDEBUG handlersconsoleHandler,fileHandler qualnameapp propagate0 [handler_consoleHandler] classStreamHandler levelDEBUG formattersimpleFormatter args(sys.stdout,) [handler_fileHandler] classlogging.handlers.TimedRotatingFileHandler levelINFO formattersimpleFormatter args(logs/app.log, midnight, 1, 7) [formatter_simpleFormatter] format%(asctime)s - %(levelname)s - %(name)s - %(message)s2. 加载配置importlogging.config logging.config.fileConfig(logging.conf)loggerlogging.getLogger(app)3. 使用日志logger.debug(调试信息)logger.info(系统启动)logger.warning(磁盘空间不足)logger.error(数据库连接失败)logger.critical(系统崩溃)五、常见坑与最佳实践1. 不要在库中使用 basicConfig()它会污染全局配置。2. 不要在库中使用 root logger库应该使用loggerlogging.getLogger(__name__)3. 不要在日志中拼接字符串错误写法logger.info(用户 %s 登录%username)正确写法logger.info(用户 %s 登录,username)原因logging 会延迟格式化提高性能避免无意义的字符串拼接4. 不要重复添加 Handler否则会出现重复日志。5. 异步日志高级技巧如果日志量很大可以使用QueueHandlerQueueListener实现异步日志提高性能。六、前沿视角日志系统的未来趋势随着云原生、微服务、分布式系统的发展日志系统也在演进JSON 结构化日志OpenTelemetry 统一追踪标准日志、指标、链路追踪三位一体日志采集与可观测性平台Loki、ELK、DatadogPython logging 依然是核心基础设施。七、总结与互动总结print 适合调试不适合生产logging 是一个完整的日志框架logging 的底层架构优雅且可扩展通过 Logger / Handler / Formatter / Filter 可以构建专业日志系统了解 logging 的底层机制能帮助你写出更高质量的代码互动我很想听听你的经验你在项目中遇到过哪些“日志相关的坑”你是否踩过 print 的坑你现在的日志系统是如何设计的欢迎在评论区分享你的故事我们一起交流、一起成长。如果你愿意我可以继续为你写logging 高级技巧异步日志、JSON 日志、上下文日志logging 与 FastAPI / Django 的最佳实践如何构建企业级日志系统ELK / Loki告诉我你想继续深入哪个方向我可以马上展开。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

有哪些网站做的比较好看的海珠建网站公

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个Spring Boot项目案例分析工具,展示5个真实项目中出现的无法访问org.springframework.boot.springapplication错误案例。每个案例应包括:1. 错误现象…

张小明 2026/1/9 22:39:33 网站建设

公司网站自己怎么建立wordpress的优点

还在为无法访问Unity游戏中的精美资源而烦恼吗?AssetRipper正是你需要的专业工具。作为一款强大的开源Unity资源提取器,它能够从各种Unity文件格式中完整提取游戏资源,并将其转换为标准的Unity工程格式。 【免费下载链接】AssetRipper GUI Ap…

张小明 2026/1/7 19:10:04 网站建设

wordpress建站全教程个人网站还用备案吗

通义万相图像生成模型支持图像编辑、图文混排输出,满足多样化生成与集成需求。 以下是一个基于 React 的通义万相 (Wan) API 可视化调用面板。 效果图: 由于目前通义万相(Wan 2.1/2.0)的视频生成通常是异步任务(提…

张小明 2026/1/9 0:24:53 网站建设

asp网站建设技术方案湖州建设局投标网站

在Windows系统安全领域,传统安全工具往往难以触及系统底层,而OpenArk作为下一代反Rootkit工具,凭借其深度内核分析能力,为系统安全检测带来了全新范式。这款开源工具不仅提供了专业级的系统监控功能,更通过模块化设计让…

张小明 2026/1/10 11:10:54 网站建设

多语言网站如何做做视频网站用什么好

第一章:Open-AutoGLM自动化测试的兴起与背景随着人工智能技术在软件工程领域的深度融合,自动化测试正迈入智能化新阶段。传统基于规则或脚本的测试方法已难以应对复杂多变的应用场景,尤其是在大模型驱动的系统中,测试用例生成、执…

张小明 2026/1/7 19:10:05 网站建设

网站建设搜狐有创意的电商公司名字大全

你的电脑是否曾经在关键时刻突然死机?重要文件是否莫名其妙出现损坏?系统运行速度是否越来越慢?这些看似无关的问题,很可能都源于同一个元凶——内存故障。今天,让我们深入了解Memtest86,这款专业级内存检测…

张小明 2026/1/9 0:00:52 网站建设