# Python 日志轮转策略 — FileHandler / TimedRotating / logrotate# 生产环境日志管理方案避免磁盘写满import loggingfrom logging.handlers import RotatingFileHandler, TimedRotatingFileHandler, WatchedFileHandlerimport osLOG_DIR /var/log/python-appos.makedirs(LOG_DIR, exist_okTrue)# 1. RotatingFileHandler — 按大小轮转10MB保留 5 个备份rotating_handler RotatingFileHandler(filenameos.path.join(LOG_DIR, app.log),modea,maxBytes10 * 1024 * 1024,backupCount5,encodingutf-8,)# app.log - app.log.1 - ... app.log.5丢弃最旧# 2. TimedRotatingFileHandler — 按时间轮转午夜保留 30 天timed_handler TimedRotatingFileHandler(filenameos.path.join(LOG_DIR, app-timed.log),whenmidnight,interval1,backupCount30,encodingutf-8,utcTrue,)# when: S秒 M分 H时 D天 midnight午夜 W0~W6每周# 3. WatchedFileHandler — 配合外部 logrotatewatched_handler WatchedFileHandler(filenameos.path.join(LOG_DIR, app-watched.log),modea,encodingutf-8,)# 格式化与配置formatter logging.Formatter(fmt%(asctime)s [%(levelname)s] %(name)s: %(message)s,datefmt%Y-%m-%d %H:%M:%S,)for h in [rotating_handler, timed_handler, watched_handler]:h.setFormatter(formatter)logger logging.getLogger(__name__)for h in [rotating_handler, timed_handler, watched_handler]:logger.addHandler(h)logger.setLevel(logging.DEBUG)logger.info(日志系统已初始化支持大小轮转、时间轮转和外部 logrotate)# 系统 logrotate 配置/etc/logrotate.d/python-app# /var/log/python-app/*.log {# daily # 每天轮转# rotate 30 # 保留 30 天# compress # gzip 压缩# delaycompress # 延迟一天# missingok # 文件缺失不报错# copytruncate # 复制并截断无需重启应用# size 100M # 超过 100M 也触发# }# 测试logrotate -d /etc/logrotate.d/python-app# 强制logrotate -f /etc/logrotate.d/python-app# copytruncatelogrotate 复制文件 - 截断原文件 -# Python 继续写入原 inode无需信号通知# 完整生产配置字典模式def setup_logging():config {version: 1,formatters: {standard: {format: %(asctime)s [%(levelname)s] %(name)s: %(message)s},json: {format: {time:%(asctime)s,level:%(levelname)s,message:%(message)s}},},handlers: {rotating: {class: logging.handlers.RotatingFileHandler,filename: os.path.join(LOG_DIR, app.log),maxBytes: 10 * 1024 * 1024,backupCount: 5,formatter: json,},error: {class: logging.handlers.TimedRotatingFileHandler,filename: os.path.join(LOG_DIR, error.log),when: midnight,backupCount: 90,level: ERROR,formatter: standard,},},loggers: {: {handlers: [rotating, error], level: DEBUG},sqlalchemy: {level: WARNING},},}logging.config.dictConfig(config)# 关键要点 # RotatingFileHandler按大小轮转maxBytes backupCount 控制总空间。# TimedRotatingFileHandler按时间轮转适合合规保留要求。# WatchedFileHandler配合外部 logrotate无需重启应用。# 系统 logrotate独立轮转方案copytruncate 无需信号通知。# 分层配置不同级别分离不同格式可读 vs JSON。