|
19 godzin temu | |
---|---|---|
.. | ||
app.log.1 | 19 godzin temu | |
app.log.5 | 19 godzin temu | |
error.py | 19 godzin temu | |
log | 19 godzin temu | |
logger.py | 19 godzin temu | |
logging_config.yaml | 19 godzin temu | |
readme.md | 19 godzin temu |
本日志系统为 FastAPI 项目提供统一的日志记录和查询功能,支持多级别日志记录、日志轮转、错误详情查询等功能。系统基于 Python 标准库 logging
模块构建,通过 YAML 配置文件实现灵活配置。
project/
├── app/
│ ├── main.py # 应用入口
│ ├── logger.py # 日志核心模块
│ ├── log/
│ │ └── logging_config.yaml # 日志配置文件
│ └── api/
│ └── errors.py # 错误查询接口
├── logs/ # 日志目录
│ ├── app.log # 普通日志
│ └── errors.log # 错误日志
└── requirements.txt
pip install PyYAML
在应用入口文件 (main.py
) 中初始化日志:
from app.logger import setup_logging
# 在创建 FastAPI 应用前初始化日志
setup_logging()
在任何模块中获取日志记录器:
from app.logger import get_logger
# 获取当前模块的日志记录器
logger = get_logger(__name__)
# 记录不同级别的日志
logger.debug("调试信息")
logger.info("常规信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")
# 记录异常堆栈
try:
# 可能出错的代码
except Exception as e:
logger.exception("操作失败", exc_info=True)
系统支持五种标准日志级别:
级别 | 描述 | 使用场景 |
---|---|---|
DEBUG | 调试信息 | 开发环境详细日志 |
INFO | 常规信息 | 操作记录、状态变更 |
WARNING | 警告信息 | 非预期但可恢复的问题 |
ERROR | 错误信息 | 操作失败、异常情况 |
CRITICAL | 严重错误 | 系统崩溃级别错误 |
控制台输出:开发环境默认输出到控制台
文件输出
:
app.log
:所有级别日志errors.log
:仅错误级别日志(ERROR+)提供 RESTful 接口查询错误详情:
GET /api/errors/{error_id}
响应示例:
{
"id": "ERR-123456789",
"timestamp": "2025-08-15 10:30:22",
"level": "ERROR",
"message": "数据库连接失败",
"traceback": [
"Traceback (most recent call last):",
" File \"app/main.py\", line 42, in get_data",
" db.connect()",
"ConnectionError: 无法连接数据库"
],
"related_entries": []
}
配置文件:log/logging_config.yaml
version: 1
disable_existing_loggers: False # 不禁用现有日志记录器
formatters:
standard:
format: "[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)d] - %(message)s"
datefmt: "%Y-%m-%d %H:%M:%S"
handlers:
console: # 控制台输出
class: logging.StreamHandler
level: INFO
formatter: standard
stream: ext://sys.stdout
file: # 普通日志文件
class: logging.handlers.RotatingFileHandler
level: DEBUG
formatter: standard
filename: logs/app.log
maxBytes: 10485760 # 10MB
backupCount: 5
encoding: utf8
error_file: # 错误日志文件
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: standard
filename: logs/errors.log
maxBytes: 10485760
backupCount: 10
encoding: utf8
loggers:
app: # 应用特定日志记录器
level: DEBUG
handlers: [console, file, error_file]
propagate: False # 不传播到根记录器
root: # 根日志记录器
level: DEBUG
handlers: [console, file, error_file]
默认配置适用于开发环境:
建议修改配置:
# 在 logging_config.yaml 中修改
handlers:
console:
level: WARNING # 生产环境减少控制台输出
loggers:
app:
level: INFO # 生产环境减少日志量
通过环境变量覆盖配置:
# 设置日志目录
export LOG_DIR=/var/log/myapp
# 设置日志级别
export LOG_LEVEL=INFO
在每个模块顶部创建日志记录器:
from app.logger import get_logger
logger = get_logger(__name__)
添加额外上下文信息:
logger.info("用户登录", extra={
"user_id": user.id,
"ip": request.client.host
})
始终记录异常堆栈:
try:
# 业务代码
except Exception as e:
logger.error("操作失败", exc_info=True)
避免记录敏感信息:
# 不要这样做
logger.info(f"用户登录: username={username}, password={password}")
# 应该这样做
logger.info("用户登录", extra={"username": username})
/api/errors/{error_id}
error_id
: 错误ID(由系统生成)当发生错误时,系统返回包含错误ID的响应:
{
"code": "ERR-123456789",
"message": "Internal server error",
"documentation": "/api/errors/ERR-123456789"
}
使用错误ID查询详情:
GET /api/errors/ERR-123456789
分析返回的堆栈跟踪信息定位问题
本日志系统为应用提供全面的日志管理解决方案,帮助开发团队快速定位和解决问题。通过合理配置和使用,可大幅提高系统可观测性和故障排查效率。