ubuntu

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

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

Python 在 Ubuntu 上的日志管理实践

一 基础配置与多目标输出

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("磁盘空间不足")

二 日志轮转与保留策略

# 应用内按大小轮转
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
}

三 结构化日志与集中化

# 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)

四 运行与运维实践

# /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

0
看了该问题的人还看了