温馨提示×

Ubuntu中Python日志如何管理

小樊
39
2025-12-06 15:30:47
栏目: 编程语言

Ubuntu下Python日志管理实战指南

一 基础配置与多处理器输出

  • 使用标准库 logging 完成控制台与文件双输出,便于本地开发与线上排障。
  • 示例要点:
    • 设置根记录器级别为 DEBUG,分别创建 StreamHandler(控制台,级别 INFO)与 FileHandler(文件,级别 DEBUG)。
    • 使用统一的格式器,包含时间、级别、模块名与消息。
    • 注意避免重复添加处理器(生产代码建议封装为可复用的配置函数)。
import logging

def setup_logging():
    fmt = '%(asctime)s %(levelname)s %(name)s: %(message)s'
    datefmt = '%Y-%m-%d %H:%M:%S'

    logging.basicConfig(level=logging.DEBUG, format=fmt, datefmt=datefmt)

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

    # 文件:DEBUG及以上
    fh = logging.FileHandler('app.log', encoding='utf-8')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(logging.Formatter(fmt, datefmt))
    logger.addHandler(fh)

    return logger

if __name__ == '__main__':
    log = setup_logging()
    log.debug('调试信息')
    log.info('应用启动')
    log.warning('磁盘空间不足')
    log.error('处理请求失败')
  • 关键概念:日志记录器(Logger)—处理器(Handler)—格式器(Formatter)分层设计,便于灵活组合与复用。

二 日志轮转与清理

  • 应用内轮转:使用 RotatingFileHandler(按大小)或 TimedRotatingFileHandler(按时间)自动切割,适合单进程/多进程写同一日志文件的场景。

  • 系统级轮转:使用 logrotate 管理日志生命周期(压缩、保留、按日/周轮转),适合长期运行服务与系统统一治理。

  • 应用内按大小轮转示例(保留最近 3 个、单文件 1MB):

from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
handler = RotatingFileHandler('app.log', maxBytes=1*1024*1024, backupCount=3, encoding='utf-8')
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s'))
logger.addHandler(handler)
  • 系统级 logrotate 配置示例(按日轮转、保留 7 天、压缩、缺失不报错、空文件不轮转):
    1. 创建配置:
sudo nano /etc/logrotate.d/myapp
  1. 写入内容(将路径替换为你的实际日志路径):
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}
  1. 手动测试与生效:
sudo logrotate -vf /etc/logrotate.d/myapp
  • 说明:
    • 使用 copytruncate 可避免应用重新打开文件句柄;若应用支持信号重开日志(如 SIGHUP),也可使用 create + postrotate 触发重开。
    • 轮转策略(大小/时间)与保留周期可按合规与存储策略调整。

三 结构化日志与集中化采集

  • 结构化日志便于接入 ELK/EFK 或数据管道,常用做法为输出 JSON
  • JSON 格式示例(使用 json_log_formatter):
import logging
from json_log_formatter import JSONFormatter

logger = logging.getLogger('json')
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)

logger.info('用户登录', extra={'user': 'alice', 'ip': '192.168.1.10'})
  • 集中化采集可选方案:
    • 文件接入 LogstashElasticsearchKibana 进行检索与可视化。
    • 或采用更轻量的 Fluent Bit/Filebeat 将日志发往 ES/Loki。
  • 适用场景:大规模服务、跨服务链路追踪、指标与日志联动分析。

四 运行在 systemd 下的实践

  • 将应用以 systemd 服务运行,使用 journald 统一采集标准输出/错误输出,便于用 journalctl 检索与追踪。
  • 服务单元示例(/etc/systemd/system/myapp.service):
[Unit]
Description=My Python App
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/myapp/app.py
StandardOutput=journal
StandardError=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • 常用查看命令:
# 实时查看
journalctl -u myapp.service -f
# 结构化查看
journalctl -u myapp.service -o json-pretty
# 按时间范围
journalctl -u myapp.service --since "2025-12-06 00:00:00" --until "2025-12-06 12:00:00"
  • 如需将日志同时写入文件与 journal,可在应用内保留文件 Handler,journald 负责统一采集与转发。

0