温馨提示×

Debian Python日志如何处理

小樊
37
2025-12-26 19:24:17
栏目: 编程语言

Debian 上 Python 日志处理实践指南

一 基础配置与快速上手

  • 使用 Python 内置的 logging 模块即可完成大多数需求,无需额外依赖。示例:
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    filename="app.log",
    filemode="a"
)

logger = logging.getLogger(__name__)
logger.debug("调试信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")
  • 要点:
    • 日志级别包含 DEBUG/INFO/WARNING/ERROR/CRITICAL,设置级别后仅输出该级别及以上。
    • 通过 format 自定义输出字段(如时间、模块名、行号等)。
    • 使用 filenamefilemode 控制输出目标与写入模式。

二 日志轮转与保留策略

  • 应用内轮转(推荐与文件处理器配合):
    • 按大小轮转:使用 RotatingFileHandler,如单个文件达到 10MB 自动分割并保留 5 个备份。
    • 按时间轮转:使用 TimedRotatingFileHandler,如每天 午夜 分割并保留 7 天。
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler

# 按大小轮转
handler = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=5)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logging.getLogger().addHandler(handler)

# 按时间轮转
handler = TimedRotatingFileHandler("app_timed.log", when="midnight", interval=1, backupCount=7)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logging.getLogger().addHandler(handler)
  • 系统级轮转(配合 logrotate 管理长期运行服务):
    • 创建配置 /etc/logrotate.d/myapp
/var/log/myapp.log {
    daily
    rotate 8
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
}
  • 测试与执行:
sudo logrotate --debug /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.conf
  • 建议:应用内轮转便于按应用粒度管理;系统级轮转适合由 systemd 托管的服务统一治理。

三 集成系统日志与 journalctl 查看

  • 将日志发送到 syslog(便于与系统日志统一):
import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger(__name__)
handler = SysLogHandler(address="/dev/log")  # Debian 默认 syslog 套接字
handler.setFormatter(logging.Formatter("%(name)s: %(levelname)s %(message)s"))
logger.addHandler(handler)
logger.info("发送到系统日志")
  • 查看方式:
    • 实时查看系统日志:tail -f /var/log/syslog
    • 使用 journalctl(若系统使用 journald):
      • 查看全部:journalctl
      • 按服务查看:journalctl -u 服务名
      • 按时间过滤:journalctl --since “2025-01-01” --until “2025-01-31”

四 配置文件与多环境管理

  • 使用配置文件解耦代码与日志策略(INI 风格):
    • 示例 logging.conf
[loggers]
keys=root

[handlers]
keys=fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=fileHandler

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('app_config.log', 'a')

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
  • 加载方式:
import logging.config
logging.config.fileConfig("logging.conf")
logger = logging.getLogger(__name__)
  • 使用字典配置(便于在代码中动态生成):
import logging.config
logging.config.dictConfig({
    "version": 1,
    "formatters": {
        "standard": {"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"}
    },
    "handlers": {
        "default": {
            "level": "INFO",
            "class": "logging.StreamHandler",
            "formatter": "standard"
        }
    },
    "loggers": {
        "": {"handlers": ["default"], "level": "INFO", "propagate": True}
    }
})
  • 多环境建议:通过环境变量切换日志级别(如开发 DEBUG、生产 INFO)。

五 权限与运维要点

  • 文件与目录权限:确保日志目录与文件可写,避免应用启动失败。
    • 示例:
touch app.log
sudo chown $USER:$USER app.log
sudo chmod 664 app.log
  • 输出分离:将 stderr 用于日志输出,避免与 stdout 的业务输出混杂,便于收集与过滤。
  • 异常堆栈:记录异常时附带堆栈,便于定位问题。
try:
    1 / 0
except Exception:
    logging.error("发生异常", exc_info=True)
  • 结构化日志:在复杂系统中加入 request_id、user_id 等字段,提升检索与分析效率。
  • 第三方库:需要更简洁的 API 与自动轮转时,可考虑 Loguru
from loguru import logger
logger.add("file.log", rotation="10 MB", level="DEBUG")
logger.add(sys.stdout, level="INFO")
  • 实践建议:为不同模块使用独立 logger 名称(如 name),便于分层过滤与维护。

0