Nano-Banana Studio异常处理:Python日志系统最佳实践
Nano-Banana Studio异常处理Python日志系统最佳实践1. 为什么需要专业的日志系统做项目最怕什么不是功能难实现而是出了问题找不到原因。想象一下用户反馈说图片生成失败了你却只能回复我看看怎么回事——然后花几个小时翻代码、猜原因。这种场景太常见了。Nano-Banana Studio这类AI项目尤其需要完善的日志系统。生成一张图片可能涉及多个步骤接收请求、预处理、模型推理、后处理、返回结果。任何一个环节出错如果没有详细日志排查就像大海捞针。好的日志系统能帮你快速定位问题根源了解系统运行状态分析性能瓶颈满足审计需求最重要的是当用户反馈问题时你能在几分钟内找到原因而不是几小时。2. 搭建基础的日志系统2.1 选择合适的日志库Python自带的logging模块其实很强大完全能满足大部分需求。先来看一个最简单的配置import logging import sys # 基础配置 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(app.log), logging.StreamHandler(sys.stdout) ] ) logger logging.getLogger(nano_banana)这样配置后日志会同时输出到控制台和文件。但生产环境需要更精细的控制。2.2 分级日志管理不同的问题需要不同的关注级别。Python logging提供了5个标准级别# 不同级别的日志示例 logger.debug(调试信息当前处理图片ID为123) # 最详细用于开发调试 logger.info(用户请求生成图片尺寸1024x768) # 正常操作记录 logger.warning(内存使用率超过80%) # 需要注意但非错误 logger.error(图片生成失败模型返回空结果) # 功能错误 logger.critical(数据库连接丢失) # 严重错误在实际项目中我建议这样设置级别开发环境DEBUG级别看到所有细节生产环境INFO级别减少日志量但保留关键信息紧急排查时临时调整为DEBUG3. 结构化日志让机器也能读懂文本日志人读起来方便但机器分析起来就困难了。结构化日志使用JSON格式便于后续处理和分析。3.1 使用JSON格式日志import json import logging from pythonjsonlogger import jsonlogger # 创建JSON格式的logger logger logging.getLogger(nano_banana_json) # 移除现有handler if logger.handlers: logger.handlers.clear() # 设置JSON格式 logHandler logging.StreamHandler() formatter jsonlogger.JsonFormatter( %(asctime)s %(name)s %(levelname)s %(message)s ) logHandler.setFormatter(formatter) logger.addHandler(logHandler) logger.setLevel(logging.INFO) # 使用结构化日志 def process_image(image_id, user_id): try: logger.info(开始处理图片, extra{ image_id: image_id, user_id: user_id, action: image_processing_start }) # 处理逻辑... except Exception as e: logger.error(图片处理失败, extra{ image_id: image_id, error: str(e), action: image_processing_failed }) raise这样的日志输出是JSON格式{ asctime: 2024-01-15 10:30:45, name: nano_banana_json, levelname: INFO, message: 开始处理图片, image_id: 123, user_id: user_456, action: image_processing_start }3.2 添加上下文信息在Web应用中我们经常需要跟踪每个请求的上下文import logging from threading import local _thread_locals local() class ContextFilter(logging.Filter): def filter(self, record): # 添加请求上下文信息 if hasattr(_thread_locals, request_id): record.request_id _thread_locals.request_id if hasattr(_thread_locals, user_id): record.user_id _thread_locals.user_id return True # 配置logger时添加filter logger.addFilter(ContextFilter())4. 高级日志技巧4.1 性能日志记录对于AI项目性能监控特别重要import time import logging from functools import wraps def log_performance(func): wraps(func) def wrapper(*args, **kwargs): start_time time.time() result func(*args, **kwargs) end_time time.time() logger.info(函数执行时间, extra{ function: func.__name__, execution_time_ms: (end_time - start_time) * 1000, args: str(args), kwargs: str(kwargs) }) return result return wrapper # 使用装饰器记录性能 log_performance def generate_image(prompt, size): # 图片生成逻辑 pass4.2 异常日志最佳实践捕获异常时不要简单记录要包含足够上下文try: # 可能出错的代码 result model.generate(image_data) except ModelTimeoutError as e: logger.error(模型生成超时, extra{ error_type: ModelTimeoutError, timeout_seconds: 30, model_name: nano_banana_pro, image_size: image_data.shape }) raise except ModelError as e: logger.error(模型生成错误, extra{ error_type: ModelError, error_message: str(e), model_input: image_data.info() # 不要记录完整数据太大 }) raise except Exception as e: logger.exception(未预期的错误) # 自动记录堆栈跟踪 raise5. 日志管理实践5.1 日志轮转策略日志文件不能无限增长需要定期轮转import logging from logging.handlers import RotatingFileHandler # 每个日志文件最大10MB保留5个备份 handler RotatingFileHandler( app.log, maxBytes10*1024*1024, backupCount5 ) logger.addHandler(handler)对于按日期轮转from logging.handlers import TimedRotatingFileHandler # 每天轮转一次保留30天日志 handler TimedRotatingFileHandler( app.log, whenD, interval1, backupCount30 ) logger.addHandler(handler)5.2 集中式日志管理当有多个服务时需要集中管理日志# 使用Logstash或Fluentd发送日志 import logging import socket from logging.handlers import SocketHandler # 发送到Logstash socket_handler SocketHandler(localhost, 5959) logger.addHandler(socket_handler) # 或者使用Elasticsearch直接记录 from elasticsearch import Elasticsearch from elasticsearch_logging_handler import ElasticsearchHandler es_handler ElasticsearchHandler( Elasticsearch([localhost:9200]), nano-banana-logs ) logger.addHandler(es_handler)6. 实战为Nano-Banana Studio配置完整日志下面是一个完整的日志配置示例# log_config.py import logging import sys from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler from pythonjsonlogger import jsonlogger def setup_logging(envdevelopment): # 创建根logger logger logging.getLogger() logger.setLevel(logging.DEBUG if env development else logging.INFO) # 清除现有handler logger.handlers.clear() # 控制台输出开发环境更详细 console_handler logging.StreamHandler(sys.stdout) if env development: console_format %(asctime)s - %(name)s - %(levelname)s - %(message)s console_handler.setFormatter(logging.Formatter(console_format)) else: json_formatter jsonlogger.JsonFormatter( %(asctime)s %(name)s %(levelname)s %(message)s ) console_handler.setFormatter(json_formatter) logger.addHandler(console_handler) # 文件输出JSON格式 file_handler RotatingFileHandler( /var/log/nano-banana/app.log, maxBytes10*1024*1024, # 10MB backupCount10 ) json_formatter jsonlogger.JsonFormatter( %(asctime)s %(name)s %(levelname)s %(message)s %(pathname)s %(lineno)d ) file_handler.setFormatter(json_formatter) logger.addHandler(file_handler) # 错误日志单独记录 error_handler TimedRotatingFileHandler( /var/log/nano-banana/error.log, whenmidnight, backupCount30 ) error_handler.setLevel(logging.ERROR) error_handler.setFormatter(json_formatter) logger.addHandler(error_handler) return logger # 在应用启动时调用 logger setup_logging(envproduction)在实际业务中的使用# image_service.py from log_config import logger class ImageService: def __init__(self): self.logger logger.getChild(ImageService) def generate_image(self, prompt, user_id, size1024x768): try: self.logger.info(开始生成图片, extra{ user_id: user_id, prompt_length: len(prompt), size: size, action: image_generation_start }) # 业务逻辑... result self._call_model(prompt, size) self.logger.info(图片生成成功, extra{ user_id: user_id, generation_time_ms: result[time_ms], image_size: result[size], action: image_generation_success }) return result except Exception as e: self.logger.error(图片生成失败, extra{ user_id: user_id, error: str(e), prompt_preview: prompt[:100], # 只记录前100字符 action: image_generation_failed }) raise log_performance def _call_model(self, prompt, size): # 调用模型的具体实现 pass7. 总结给Nano-Banana Studio配上完善的日志系统就像给汽车装上了仪表盘和故障诊断系统。刚开始可能觉得配置有点复杂但一旦用起来你会发现排查问题的效率提升了好几倍。实际用下来结构化日志确实比传统文本日志好用很多特别是需要用工具分析日志的时候。性能日志也很实用能帮你发现哪些环节比较耗时方便针对性优化。如果你刚开始接触日志系统建议先从基础配置开始慢慢再添加高级功能。最重要的是养成在关键位置记录日志的习惯这样出了问题才能快速定位。日志系统搭建好后维护起来其实很省心但它带来的价值却是实实在在的。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。