在 Debian 上做 Python 日志管理,建议以 Python 内置 logging 为核心,按环境配置日志级别与输出目的地,配合 按大小/时间轮转 与 系统级日志(journald/syslog),必要时引入 结构化日志 与 集中式平台,形成可维护、可观测、可扩展的体系。
一、核心方案与最小示例
# 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
二、系统级集成与集中化
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 写入的日志")
三、日志轮转与保留策略
from logging.handlers import TimedRotatingFileHandler
fh = TimedRotatingFileHandler("/var/log/myapp/app.log", when="midnight", interval=1, backupCount=7, encoding="utf-8")
/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
}
四、结构化日志与第三方库
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"})
from loguru import logger
logger.add("app.log", rotation="10 MB", retention="7 days", compression="zip", format="{time} {level} {message}")
logger.info("使用 Loguru 写入日志")
五、生产落地清单