Python 日志记录
外观
Python日志记录[编辑 | 编辑源代码]
Python日志记录是软件开发中用于追踪程序运行时事件的重要机制。通过记录不同级别的信息(如调试信息、警告、错误等),开发者可以更高效地诊断问题、监控应用状态并分析用户行为。Python内置的logging
模块提供了灵活的日志记录功能,适用于从简单脚本到大型应用程序的各种场景。
日志记录基础[编辑 | 编辑源代码]
为什么需要日志记录?[编辑 | 编辑源代码]
- 调试: 记录程序执行流程,帮助定位错误。
- 监控: 跟踪应用程序的运行状态和性能。
- 审计: 记录用户操作或系统事件以满足合规要求。
日志级别[编辑 | 编辑源代码]
Python定义了5个标准日志级别(按严重性递增):
级别 | 数值 | 用途 |
---|---|---|
DEBUG |
10 | 详细调试信息 |
INFO |
20 | 确认程序按预期运行 |
WARNING |
30 | 潜在问题提示 |
ERROR |
40 | 严重错误导致功能失效 |
CRITICAL |
50 | 可能导致程序崩溃的严重错误 |
基本用法[编辑 | 编辑源代码]
简单示例[编辑 | 编辑源代码]
import logging
# 基础配置(输出到控制台)
logging.basicConfig(level=logging.INFO)
# 记录不同级别的日志
logging.debug("这条消息不会显示") # 级别低于INFO
logging.info("程序启动")
logging.warning("磁盘空间不足80%")
logging.error("数据库连接失败")
输出:
INFO:root:程序启动 WARNING:root:磁盘空间不足80% ERROR:root:数据库连接失败
日志格式定制[编辑 | 编辑源代码]
通过format
参数自定义输出格式:
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
logging.info("格式化日志示例")
输出:
2023-11-15 14:30:00 - root - INFO - 格式化日志示例
高级配置[编辑 | 编辑源代码]
日志处理器(Handlers)[编辑 | 编辑源代码]
将日志输出到不同目标:
StreamHandler
: 输出到控制台(默认)FileHandler
: 写入文件SMTPHandler
: 通过邮件发送错误日志
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)
# 创建文件处理器
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.WARNING)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 添加处理器到logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.info("这条信息会显示在控制台")
logger.warning("这条警告会同时出现在控制台和文件")
日志流程示意图[编辑 | 编辑源代码]
实际应用案例[编辑 | 编辑源代码]
Web应用错误监控[编辑 | 编辑源代码]
记录Flask应用的错误和访问日志:
from flask import Flask
import logging
from logging.handlers import RotatingFileHandler
app = Flask(__name__)
# 配置滚动日志文件(最大1MB,保留3个备份)
handler = RotatingFileHandler('app.log', maxBytes=1024*1024, backupCount=3)
handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
app.logger.addHandler(handler)
@app.route('/')
def index():
app.logger.info('主页访问')
return "Hello World"
if __name__ == '__main__':
app.run(debug=True)
性能分析日志[编辑 | 编辑源代码]
记录函数执行时间:
import logging
import time
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("perf")
def time_it(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
duration = time.time() - start
logger.info(f"{func.__name__} 执行耗时: {duration:.4f}秒")
return result
return wrapper
@time_it
def calculate_sum(n):
return sum(range(n))
calculate_sum(10**6)
输出:
INFO:perf:calculate_sum 执行耗时: 0.0453秒
最佳实践[编辑 | 编辑源代码]
1. 避免root logger:为每个模块创建具名logger(logging.getLogger(__name__)
)
2. 合理设置级别:生产环境通常使用INFO或WARNING级别
3. 敏感信息过滤:不要在日志中记录密码等敏感数据
4. 使用结构化日志:对于复杂系统,考虑JSON格式日志
5. 日志轮转:使用RotatingFileHandler
或TimedRotatingFileHandler
防止日志文件过大
数学表达式示例[编辑 | 编辑源代码]
当日志需要包含计算指标时,可以使用数学公式: 解析失败 (语法错误): {\displaystyle \log_{10} \left( \frac{\text{error\_count}}{\text{total\_requests}} \right) < \text{threshold} }
总结[编辑 | 编辑源代码]
Python的logging
模块提供了强大而灵活的日志记录系统。通过合理配置日志级别、格式和处理器,开发者可以构建适合各种应用场景的日志解决方案。良好的日志实践能显著提高应用程序的可维护性和可调试性。