第九章:Logging and Monitoring
Chapter 9: Logging and Monitoring
从错误处理到日志监控:如何让系统成为“智能健康监测仪”?
在上一章的错误处理中,我们已经能让系统优雅地应对各种问题。但你是否想过:如果用户报告“天气查询失败”,如何快速定位是天气API的问题还是代理配置错误?就像医生通过体检报告诊断病情一样,本章将介绍如何通过日志与监控系统记录关键信息,帮助开发者追踪问题根源。
核心问题:如何让系统自动留下“行动轨迹”?
想象你是一名侦探,需要通过线索破解案件:
- 用户输入了什么?
- 代理执行到哪一步出错了?
- 天气API返回了什么数据?
日志与监控系统就像这位侦探的“线索记录本”,通过以下机制实现:
✅ 自动记录不同严重程度的信息(从调试到错误)
✅ 支持同时输出到控制台和日志文件
✅ 通过配置控制日志详细程度
核心概念分解
1. 日志级别:像警报级别一样区分信息重要性
支持五级严重程度,从低到高:
级别 | 场景示例 |
---|---|
DEBUG | 记录“正在连接天气API”这样的详细步骤 |
INFO | 显示“用户输入了‘北京天气’”等常规操作 |
WARNING | 提示“API响应超时,尝试重试” |
ERROR | 标记“天气API返回HTTP 500错误” |
CRITICAL | 报告“代理无法启动,系统即将退出” |
2. 输出方式:同时记录到“现场笔记”和“电子档案”
- 控制台输出:实时查看当前进程的运行状态
- 日志文件:长期保存供后续分析(如
logs/20240101.log
)
# 示例:记录不同级别的日志
logger.debug("正在初始化代理") # 调试信息
logger.info("用户输入:上海天气如何?") # 普通操作
logger.error("调用天气API失败:网络错误") # 错误提示
3. 自定义日志格式:让记录更清晰
通过配置定义日志的“书写格式”,例如:
[2024-01-01 10:00:00] [DEBUG] [代理模块] 正在连接天气API...
如何用日志与监控解决问题?
场景:调试天气查询失败问题
步骤1:调整日志级别查看详细信息
# 运行时添加参数开启DEBUG模式
python run_mcp.py --log-level DEBUG
步骤2:观察控制台输出
[DEBUG] 正在加载天气API配置...
[DEBUG] 检测到API密钥:"xxx"
[ERROR] 调用天气API返回HTTP 403:密钥无效!
步骤3:检查日志文件
打开logs/20240101.log
文件,找到完整记录:
[2024-01-01 10:00:00] [ERROR] [天气工具] API返回:{"error":"Invalid API Key"}
此时,开发者能快速定位问题:用户配置了错误的API密钥。
内部实现揭秘:日志的“记录流程”
流程分解(用简单序列图演示)
关键代码解析
1. 日志配置文件(app/config.toml片段)
[logging]
console_level = "INFO" # 控制台显示级别
file_level = "DEBUG" # 日志文件记录级别
2. 日志初始化代码(app/logger.py片段)
def define_log_level(print_level="INFO", logfile_level="DEBUG"):_logger.remove()_logger.add(sys.stderr, level=print_level) # 控制台输出_logger.add("logs/app_{time}.log", level=logfile_level) # 文件保存return _logger
3. 代理中的日志使用(run_mcp.py片段)
async def run_single_prompt(self, prompt: str) -> None:logger.info(f"收到用户请求:{prompt}") # 记录用户输入try:response = await self.agent.run(prompt)logger.debug("成功获取代理响应") # 调试信息except Exception as e:logger.error(f"执行失败:{str(e)}") # 记录错误
深入理解日志与监控系统
通过本章,你已掌握:
✅ 如何通过日志级别过滤关键信息
✅ 控制台与文件的双通道输出机制
✅ 如何通过日志定位复杂问题根源
小结与展望
通过日志与监控系统,我们实现了:
✅ 全流程的系统操作追踪
✅ 开发者友好的调试信息记录
✅ 错误发生时的快速定位能力
下一章我们将探讨部署抽象,学习如何让AI系统像“变形金刚”一样适应不同环境——现在你可以尝试修改日志级别,观察不同场景下的输出效果了!