温馨提示×

Python在Ubuntu上的日志管理如何实现

小樊
43
2025-12-26 07:39:52
栏目: 编程语言

Python 在 Ubuntu 上的日志管理实践

一 基础配置与多目标输出

  • 使用标准库 logging 完成控制台与文件的同步输出,便于本地调试与持久化留存。
  • 示例要点:
    • 设置日志级别(如 DEBUG/INFO)、格式(时间、级别、模块名、消息)、输出目的地(控制台与文件)。
    • 推荐为不同目标设置不同级别,例如控制台输出 INFO+,文件记录 DEBUG+
  • 参考代码:
import logging

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

# 文件处理器:记录 DEBUG 及以上
fh = logging.FileHandler("app.log", mode="a", encoding="utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(
    "%(asctime)s %(levelname)s %(name)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
))

# 控制台处理器:输出 INFO 及以上
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))

logger.addHandler(fh)
logger.addHandler(ch)

logger.debug("调试信息")
logger.info("应用启动")
logger.warning("磁盘空间不足")
  • 运行方式建议:开发时直接运行脚本;生产环境可结合进程管理工具(如 supervisor)或后台运行并记录输出。

二 日志轮转与保留策略

  • 应用内轮转(推荐优先):使用 RotatingFileHandler / TimedRotatingFileHandler 控制单文件大小或按时间切分,避免日志无限增长。
    • 示例:单文件 1MB、保留 3 个备份;或按天切分并保留 7 天。
  • 系统级轮转:使用 logrotate 管理日志生命周期(压缩、清理、按日/周轮转),与 Python 解耦,适合系统统一治理。
  • 参考代码与配置:
# 应用内按大小轮转
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler("app.log", maxBytes=1*1024*1024, backupCount=3)
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter(
    "%(asctime)s %(levelname)s %(name)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
))
logger.addHandler(handler)
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    sharedscripts
    postrotate
        # 若应用支持信号重载,可发送 HUP;否则用服务管理工具重启
        systemctl reload myapp || true
    endscript
}
  • 验证与运维:
    • 手动测试:sudo logrotate -vf /etc/logrotate.d/myapp
    • 查看状态:cat /var/lib/logrotate/status
    • 提示:应用内轮转与应用无强依赖;使用 systemd 管理的服务优先用 systemctl reload/restart 触发日志句柄重建。

三 结构化日志与集中化

  • 结构化日志便于接入 ELK/EFKGraylog 等平台做检索与可视化。
  • 方案对比与示例:
    • JSON 格式:使用 json_log_formatter 输出结构化日志,便于机器解析。
    • 第三方库:使用 loguru 简化配置并支持按大小/时间自动轮转。
    • 系统日志:通过 SysLogHandler 将日志发送到 syslog/journald,统一由系统收集。
  • 参考代码:
# JSON 结构化日志
import json_log_formatter, logging
formatter = json_log_formatter.JSONFormatter()
handler = logging.FileHandler("app.json.log", encoding="utf-8")
handler.setFormatter(formatter)
logging.getLogger("json").addHandler(handler)
logging.getLogger("json").info({"event": "start", "user": "alice"})

# Loguru(简洁 API,内置轮转)
from loguru import logger
logger.add("app.log", rotation="500 MB", level="DEBUG", serialize=True)  # serialize=True 输出 JSON

# 发送到系统日志
from logging.handlers import SysLogHandler
syslog = SysLogHandler(address="/dev/log")
syslog.setFormatter(logging.Formatter("%(name)s[%(process)d]: %(message)s"))
logging.getLogger("sys").addHandler(syslog)
  • 集中化采集(ELK 简要):
    • Filebeat/Fluentd 采集文件或 Syslog → Logstash 解析与过滤 → Elasticsearch 存储 → Kibana 可视化。

四 运行与运维实践

  • 后台运行与输出重定向:开发/简单场景可用 nohup python script.py > output.log 2>&1 & 快速落地;更推荐用 supervisor 管理进程生命周期与日志文件。
  • 进程管理示例(supervisor):
# /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=python /opt/myapp/app.py
directory=/opt/myapp
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp/error.log
stdout_logfile=/var/log/myapp/output.log
  • 实践要点:
    • 日志目录提前创建并设定合适权限(如 /var/log/myapp/,权限 0755,文件 0640)。
    • 避免仅打印到控制台,生产环境务必写入文件或发送至集中系统。
    • 合理设置日志级别与采样,防止性能抖动与磁盘占满。
    • 对关键业务添加 trace_id/request_id,便于链路追踪。

0