Debian Python日志处理技巧
小樊
37
2025-11-23 08:43:54
Debian 上 Python 日志处理技巧
一 基础配置与多目标输出
- 使用标准库 logging 搭建最小可用配置,区分环境设置日志级别,避免生产输出过多 DEBUG。
- 同时输出到控制台与文件,便于本地调试与持久化留存。
- 统一日志格式,包含时间、级别、模块、函数、行号等上下文,便于检索与排错。
- 示例要点:
- 创建 logger、handler、formatter,分别设置级别与格式;
- 推荐格式:‘%(asctime)s [%(levelname)s] %(name)s:%(funcName)s:%(lineno)d - %(message)s’;
- 避免重复添加 handler(生产代码中建议封装为可复用配置)。
二 日志轮转与保留策略
- 按大小轮转:使用 RotatingFileHandler,控制单文件大小与保留个数,防止磁盘被撑满。
- 按时间轮转:使用 TimedRotatingFileHandler,如按天切割,保留近 N 天历史。
- 系统级轮转:使用 logrotate 管理 Python 应用日志文件(适合 systemd 服务),支持按日/周轮转、压缩、延迟压缩、缺失不报错、空文件不轮转、创建指定权限新文件、轮转后执行脚本(如优雅重启服务)。
- 建议:应用内轮转用于“快速切分与保留”,系统级 logrotate 用于“统一归档、压缩与清理”。
三 结构化日志与敏感信息处理
- 结构化日志便于检索与分析:在 JSONFormatter 中输出 timestamp、level、logger、message、module、function、lineno、context 等字段;异常堆栈可通过 exc_info 或 LoggerAdapter/extra 附加上下文。
- 日志过滤:通过 logging.Filter 屏蔽敏感级别或敏感内容(如调试日志、密钥片段)。
- 第三方库 loguru 可零配置上手,支持按大小/时间自动轮转、保留天数、压缩、异常自动捕获(@logger.catch),适合快速开发与中小型项目。
- 建议:生产环境优先结构化(JSON),并与集中式日志平台(如 ELK/Graylog)字段对齐。
四 系统级集成与集中化
- 使用 journalctl 查看与管理服务日志(适合以 systemd 管理的 Python 服务):
- 查看服务日志:journalctl -u your.service;
- 按时间过滤:journalctl --since “2025-11-20” --until “2025-11-23”;
- 实时跟踪:journalctl -u your.service -f。
- 集中式日志:将应用日志发往 rsyslog/ELK/Graylog,统一检索、可视化与告警;ELK 方案包含 Elasticsearch、Logstash、Kibana,适合大规模与复杂分析场景。
- 建议:无侵入接入 rsyslog(UDP/TCP),或在应用内直接输出 JSON 到文件供 Logstash/Fluent Bit 采集。
五 生产实践清单
- 环境与级别:开发 DEBUG、预发 INFO、生产 WARNING/ERROR;通过环境变量或配置文件切换。
- 单一职责 logger:按模块/组件命名,避免 root logger 滥用;handler 级别与 logger 级别组合控制输出。
- 异常与堆栈:关键路径使用 logger.exception 或 exc_info=True,保留堆栈与上下文变量。
- 并发安全:多线程使用 QueueHandler + QueueListener 集中写入;多进程避免多实例争抢同一日志文件(可用进程号区分文件或采用进程安全的队列/系统日志)。
- 性能与采样:高 QPS 场景避免频繁字符串拼接与 I/O,必要时对调试日志采样或降级。
- 安全与合规:脱敏敏感信息(密码、令牌、身份证号等);设置日志文件权限(如 0640),防止越权访问;定期审计与清理。
- 监控与告警:将 ERROR/CRITICAL 与关键业务指标结合,接入 Sentry/Prometheus Alertmanager 实现主动告警。