温馨提示×

Python在Debian上的日志管理怎么做

小樊
41
2025-11-23 08:07:04
栏目: 编程语言

在 Debian 上做 Python 日志管理,建议以 Python 内置 logging 为核心,按环境配置日志级别与输出目的地,配合 按大小/时间轮转系统级日志(journald/syslog),必要时引入 结构化日志集中式平台,形成可维护、可观测、可扩展的体系。

一、核心方案与最小示例

  • 使用标准库 logging 同时输出到控制台与滚动文件,便于本地开发与问题排查。
  • 示例要点:
    • 日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL
    • 处理器:StreamHandler(控制台)、RotatingFileHandler(按大小滚动)
    • 推荐格式:包含 时间、级别、模块/函数、行号、进程/线程、消息
# pip install python-json-logger  # 如需 JSON 输出
import logging
from logging.handlers import RotatingFileHandler

LOG_FMT = '%(asctime)s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(process)d %(threadName)s | %(message)s'
DATE_FMT = '%Y-%m-%d %H:%M:%S'

logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)

# 控制台:INFO 及以上
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(logging.Formatter(LOG_FMT, DATE_FMT))
logger.addHandler(ch)

# 滚动文件:DEBUG 及以上,单个 10MB,保留 7 个备份
fh = RotatingFileHandler("/var/log/myapp/app.log", maxBytes=10*1024*1024, backupCount=7, encoding="utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(LOG_FMT, DATE_FMT))
logger.addHandler(fh)

# 使用示例
logger.info("服务启动", extra={"host": "app01", "port": 8000})
try:
    1 / 0
except Exception:
    logger.exception("未捕获异常")  # 自动附带 traceback

二、系统级集成与集中化

  • 写入 systemd journal(推荐)
    • 优点:与 journald 统一采集、按服务/单元检索、支持结构化字段。
    • 示例:
      import logging
      from logging.handlers import SysLogHandler
      
      logger = logging.getLogger("myapp")
      logger.setLevel(logging.INFO)
      handler = SysLogHandler(address="/dev/log", facility=SysLogHandler.LOG_LOCAL0)
      handler.setFormatter(logging.Formatter("%(name)s[%(process)d]: %(levelname)s %(message)s"))
      logger.addHandler(handler)
      logger.info("通过 journal 写入的日志")
      
    • 查看:
      • 实时查看服务日志:journalctl -u myapp.service -f
      • 按时间过滤:journalctl --since “2025-11-23 00:00:00”
  • 写入 syslog(传统)
    • 将日志发送到 rsyslog,由 rsyslog 负责落盘与转发(适合与既有 syslog 流程对接)。
  • 集中式日志
    • 小规模可用 rsyslog + 文件收集;中大型建议 ELK/GraylogGraylog 做检索、告警与可视化。

三、日志轮转与保留策略

  • 应用内轮转(推荐优先)
    • 使用 RotatingFileHandler(按大小)或 TimedRotatingFileHandler(按时间,如每天午夜轮转)。
    • 示例(按天轮转,保留 7 天):
      from logging.handlers import TimedRotatingFileHandler
      fh = TimedRotatingFileHandler("/var/log/myapp/app.log", when="midnight", interval=1, backupCount=7, encoding="utf-8")
      
  • 系统级轮转(与系统统一管理)
    • 使用 logrotate 管理已落盘到 /var/log/ 的日志文件,便于压缩、清理与归档。
    • 示例配置 /etc/logrotate.d/myapp
      /var/log/myapp/*.log {
          daily
          rotate 14
          compress
          delaycompress
          missingok
          notifempty
          create 0644 myapp myapp
          postrotate
              systemctl reload myapp.service >/dev/null 2>&1 || true
          endscript
      }
      
    • 常用命令:
      • 测试配置:logrotate --debug /etc/logrotate.d/myapp
      • 强制执行:logrotate -f /etc/logrotate.d/myapp
  • 选择建议
    • 应用内轮转更贴近业务语义(如按大小/时间),系统级轮转便于统一运维策略(压缩、保留、归档)。

四、结构化日志与第三方库

  • 结构化日志(JSON)
    • 便于 ELK/Graylog 检索、分析与可视化;可配合 python-json-loggerLoguru 的 JSON 渲染。
    • 示例(标准库 + JSON):
      import logging
      from pythonjsonlogger import jsonlogger
      
      logger = logging.getLogger("myapp.json")
      handler = logging.StreamHandler()
      fmt = jsonlogger.JsonFormatter("%(asctime)s %(levelname)s %(name)s %(funcName)s %(lineno)d %(message)s")
      handler.setFormatter(fmt)
      logger.addHandler(handler)
      logger.setLevel(logging.INFO)
      logger.info("用户登录", extra={"user": "alice", "ip": "192.0.2.10"})
      
  • 第三方库
    • Loguru:更少的样板代码、自动轮转、异常捕获装饰器、易用的 JSON/彩色 输出。
      from loguru import logger
      logger.add("app.log", rotation="10 MB", retention="7 days", compression="zip", format="{time} {level} {message}")
      logger.info("使用 Loguru 写入日志")
      
    • Structlog:面向事件与上下文的结构化日志,适合微服务链路追踪与复杂系统。

五、生产落地清单

  • 目录与权限
    • 日志目录:/var/log/myapp/,属主 myapp:myapp,权限 0755/0644;确保服务账号可写。
  • 服务化与标准输出
    • systemd 管理服务,优先将日志写到 stdout/stderr,由 journald 统一采集;文件日志作为补充或审计用途。
  • 级别与环境
    • 开发:DEBUG;预发:INFO;生产:WARNING/ERROR;通过 环境变量配置文件 切换,避免硬编码。
  • 安全与合规
    • 避免记录 密码/密钥/卡号;必要时做 脱敏过滤器
  • 监控与告警
    • ERROR/CRITICAL 建立 告警(如对接 Sentry、企业微信/钉钉机器人、邮件)。
  • 保留与合规
    • 明确 保留周期归档策略(如 14/30 天),满足审计与合规要求。

0