跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Python 错误日志
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Python错误日志 = == 介绍 == '''Python错误日志'''是记录程序运行时异常和错误信息的机制,通过系统化的日志记录可以帮助开发者快速定位问题、调试代码并监控应用状态。Python标准库提供了`logging`模块作为核心工具,支持多级别日志记录、格式化输出以及灵活的输出目标(如文件/控制台/网络等)。 错误日志与简单的`print()`语句或异常捕获不同,它具有以下核心优势: * '''结构化存储''':支持时间戳、模块名、日志级别等元数据 * '''分级处理''':区分DEBUG/INFO/WARNING/ERROR/CRITICAL等严重程度 * '''持久化''':可写入文件或数据库供后续分析 * '''线程安全''':适合多线程/多进程环境 == 日志级别 == Python定义了6个标准日志级别(按严重程度递增): <mermaid> graph LR NOTSET-->DEBUG-->INFO-->WARNING-->ERROR-->CRITICAL </mermaid> {| class="wikitable" |+ 日志级别说明 ! 级别 !! 数值 !! 使用场景 |- | NOTSET || 0 || 不设置级别,继承父记录器 |- | DEBUG || 10 || 调试细节(变量值、流程跟踪) |- | INFO || 20 || 程序正常运行确认(服务启动、配置加载) |- | WARNING || 30 || 潜在问题(低磁盘空间、非预期参数) |- | ERROR || 40 || 功能故障(数据库连接失败、IO错误) |- | CRITICAL || 50 || 系统级错误(内存耗尽、关键服务崩溃) |} == 基础用法 == === 控制台日志示例 === <syntaxhighlight lang="python"> import logging # 基础配置 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def divide(a, b): try: logger.debug(f"Attempting division: {a}/{b}") result = a / b logger.info(f"Division succeeded: {result}") return result except ZeroDivisionError: logger.error("Division by zero!", exc_info=True) return None divide(10, 2) # 正常执行 divide(5, 0) # 触发错误 </syntaxhighlight> '''输出示例:''' <pre> 2023-08-20 14:30:15,123 - __main__ - DEBUG - Attempting division: 10/2 2023-08-20 14:30:15,124 - __main__ - INFO - Division succeeded: 5.0 2023-08-20 14:30:15,125 - __main__ - DEBUG - Attempting division: 5/0 2023-08-20 14:30:15,126 - __main__ - ERROR - Division by zero! Traceback (most recent call last): File "<stdin>", line 4, in divide ZeroDivisionError: division by zero </pre> === 文件日志配置 === <syntaxhighlight lang="python"> import logging # 创建文件处理器 file_handler = logging.FileHandler('app.log', mode='a') file_handler.setLevel(logging.WARNING) file_formatter = logging.Formatter('%(levelname)s:%(name)s:%(asctime)s:%(message)s') file_handler.setFormatter(file_formatter) # 创建控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 配置根记录器 root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) root_logger.addHandler(file_handler) root_logger.addHandler(console_handler) # 使用示例 logging.warning("This will appear in both console and file") logging.info("This appears only in console") logging.debug("Hidden from both by default") </syntaxhighlight> == 高级特性 == === 日志过滤 === 自定义过滤规则示例: <syntaxhighlight lang="python"> class CriticalFilter(logging.Filter): def filter(self, record): return record.levelno == logging.CRITICAL critical_filter = CriticalFilter() logger.addFilter(critical_filter) </syntaxhighlight> === 日志轮转 === 使用`RotatingFileHandler`防止日志文件过大: <syntaxhighlight lang="python"> from logging.handlers import RotatingFileHandler handler = RotatingFileHandler( 'app.log', maxBytes=1024*1024, backupCount=5 # 1MB per file, keep 5 backups ) </syntaxhighlight> === 结构化日志 === (Python 3.2+)支持字典传递额外上下文: <syntaxhighlight lang="python"> logger.info("User login", extra={'user': 'alice', 'ip': '192.168.1.1'}) </syntaxhighlight> == 数学公式支持 == 当日志分析涉及统计时,可能需要计算错误频率: 错误发生率公式: <math> \text{Error Rate} = \frac{\text{Error Count}}{\text{Total Operations}} \times 100\% </math> == 实际案例 == === Web应用错误监控 === 典型Flask应用集成示例: <syntaxhighlight lang="python"> from flask import Flask import logging from logging.handlers import SMTPHandler app = Flask(__name__) # 邮件报警配置 mail_handler = SMTPHandler( mailhost=('smtp.example.com', 587), fromaddr='server@example.com', toaddrs=['admin@example.com'], subject='Application Error', credentials=('username', 'password'), secure=() ) mail_handler.setLevel(logging.ERROR) app.logger.addHandler(mail_handler) @app.route('/') def index(): app.logger.info('Homepage accessed') return "Welcome" if __name__ == '__main__': app.run() </syntaxhighlight> === 多模块日志架构 === <mermaid> graph TB subgraph 应用结构 A[main.py] --> B[module1.py] A --> C[module2.py] end subgraph 日志流 B --> D[Root Logger] C --> D D --> E[File Handler] D --> F[Console Handler] end </mermaid> == 最佳实践 == 1. '''避免根记录器滥用''':使用`getLogger(__name__)`创建模块级记录器 2. '''合理设置级别''':生产环境通常用INFO及以上级别 3. '''包含上下文信息''':如用户ID、请求ID等追踪字段 4. '''敏感信息过滤''':自动移除密码、密钥等数据 5. '''统一日志格式''':团队约定时间格式、字段顺序 == 参见 == * [[Python异常处理]] * [[Python调试技巧]] * [[Python性能优化]] [[Category:编程语言]] [[Category:Python]] [[Category:Python 异常处理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)