Skip to content

01-日志与监控

本章讲解 Python 日志记录和应用监控的最佳实践。


Python logging 模块

基础用法

python
import logging

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('app.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

# 不同级别的日志
logger.debug("调试信息")
logger.info("正常运行消息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")

日志级别

级别数值使用场景
DEBUG10调试信息
INFO20正常运行消息
WARNING30潜在问题
ERROR40功能执行失败
CRITICAL50系统可能崩溃

高级日志配置

日志轮转

python
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler

# 按大小轮转
rotating_handler = RotatingFileHandler(
    'logs/app.log',
    maxBytes=10*1024*1024,  # 10MB
    backupCount=5
)

# 按时间轮转
timed_handler = TimedRotatingFileHandler(
    'logs/app.log',
    when='midnight',
    backupCount=30
)

配置文件

python
LOGGING_CONFIG = {
    'version': 1,
    'formatters': {
        'default': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'default',
        },
        'file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/app.log',
            'maxBytes': 10485760,
            'backupCount': 5,
        },
    },
    'root': {
        'level': 'INFO',
        'handlers': ['console', 'file'],
    },
}

结构化日志

JSON 格式日志

bash
# 安装
uv add python-json-logger
python
from pythonjsonlogger import jsonlogger

formatter = jsonlogger.JsonFormatter(
    fmt='%(asctime)s %(name)s %(levelname)s %(message)s'
)

logger.info("User login", extra={
    "user_id": 123,
    "ip_address": "192.168.1.1"
})

性能监控

装饰器记录执行时间

python
import time
from functools import wraps

def timing_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        logger.info(f"{func.__name__} executed in {time.time() - start:.3f}s")
        return result
    return wrapper

健康检查端点

python
from flask import Flask, jsonify
import psutil

app = Flask(__name__)

@app.route('/health')
def health_check():
    return jsonify({
        "status": "healthy",
        "metrics": {
            "cpu_percent": psutil.cpu_percent(),
            "memory_percent": psutil.virtual_memory().percent,
        }
    })

本章小结

┌─────────────────────────────────────────────────────────────┐
│                    日志与监控 知识要点                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   日志级别:                                                 │
│   ✓ DEBUG < INFO < WARNING < ERROR < CRITICAL               │
│                                                             │
│   日志配置:                                                 │
│   ✓ 使用 dictConfig 配置                                    │
│   ✓ 实现日志轮转                                            │
│                                                             │
│   结构化日志:                                               │
│   ✓ 使用 JSON 格式                                          │
│   ✓ 添加上下文信息                                          │
│                                                             │
│   监控:                                                     │
│   ✓ 健康检查端点                                            │
│   ✓ 性能指标收集                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘