在 Debian 上部署 Python 程序时,日志通常不是“能写出来就行”,而是要同时考虑格式统一、文件增长控制以及是否接入系统日志。下面按实际使用顺序,把环境准备、基础配置、日志轮转和 syslog 集成拆开说明,你可以据此判断当前项目该用最简单的文件日志,还是进一步接入系统级管理。
准备 Debian 上的 Python 运行环境
如果你的 Debian 环境已经装好 Python 3,标准库里的 logging 模块通常可以直接使用,不需要额外安装第三方日志库。对于刚初始化的系统,先把基础运行环境补齐即可:
sudo apt update
sudo apt install python3 python3-pip
这里的重点是确认 python3 和 python3-pip 已经可用。本文后面涉及的 logging、RotatingFileHandler 和 SysLogHandler 都来自 Python 自带能力,安装完 Python 之后就能直接调用。
先完成基础日志配置
对大多数脚本和小型服务来说,第一步应该先把基础日志规则定下来,包括日志级别、输出格式、时间格式以及写入文件的位置。Python 标准库中的 logging 模块已经覆盖了这部分需求。

一个可直接运行的基础示例
import logging
# 配置日志记录
logging.basicConfig(
level=logging.DEBUG, # 设置日志级别
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 设置日志格式
datefmt='%Y-%m-%d %H:%M:%S', # 设置日期时间格式
filename='app.log', # 日志文件名
filemode='a' # 追加模式
)
# 获取日志记录器
logger = logging.getLogger(__name__)
# 记录不同级别的日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
这段配置做了几件事:

- 把日志级别设为
logging.DEBUG,意味着DEBUG及以上级别的消息都会被记录。 - 通过
format指定统一输出格式,常见字段包括时间、记录器名称、级别和消息正文。 - 使用
datefmt='%Y-%m-%d %H:%M:%S'约束时间显示样式,便于后续排查问题时按时间线阅读。 - 通过
filename='app.log'把输出写入app.log,并用filemode='a'指定追加写入,而不是每次覆盖旧日志。
执行后,不同级别的日志会按统一格式落到 app.log。如果你当前只是想让脚本先具备可追踪性,这一步已经足够。
不过,基础文件日志只能解决“有记录可查”,还没有解决“日志长期运行后会越来越大”的问题。只要程序常驻,下一步通常就该考虑轮转策略。
日志文件变大后,如何做轮转
把日志长期写进单个文件,最直接的风险就是磁盘占用失控。Debian 上运行的服务如果没有轮转机制,日志文件可能持续膨胀,最后影响系统空间和排障效率。Python 在 logging.handlers 中已经提供了常见轮转方案。
常见选择:按大小或按时间轮转
标准库里常用的两个处理器分别是:
RotatingFileHandler:按文件大小切分。TimedRotatingFileHandler:按时间周期切分。
如果你的应用日志量波动比较明显,按大小轮转通常更容易控制磁盘占用。下面保留原始示例,使用的是 RotatingFileHandler。
按大小轮转的示例配置
import logging
from logging.handlers import RotatingFileHandler
# 配置日志记录
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 获取日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建一个RotatingFileHandler,最大文件大小为1MB,最多保留3个备份文件
handler = RotatingFileHandler('app.log', maxBytes=1*1024*1024, backupCount=3)
handler.setLevel(logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 添加处理器到日志记录器
logger.addHandler(handler)
# 记录不同级别的日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
这个配置里最需要关注的是两个参数:
maxBytes=1*1024*1024:单个日志文件最大为 1MB。backupCount=3:最多保留 3 个历史备份文件。
当 app.log 超过 1MB 后,处理器会自动执行滚动,旧文件按备份规则保留。这样做的意义很直接:你既能保住近期日志用于排查,又不会让单个文件无限增长。
实际选择时可以这样判断:
- 日志量小、脚本执行时间短:基础
basicConfig文件输出通常就够用。 - 服务持续运行、日志增长快:优先考虑
RotatingFileHandler。 - 更关注按天、按小时归档:再转向
TimedRotatingFileHandler。
需要统一运维时,接入系统日志
如果你的 Python 程序并不是孤立运行,而是和系统服务一起维护,那么把应用日志接入 Debian 的系统日志会更省事。这样做的好处是,应用日志和其他系统组件日志可以走同一套集中管理和轮转流程,排查时不需要来回切换多个文件。

使用 SysLogHandler 的示例
import logging
from logging.handlers import SysLogHandler
# 配置日志记录
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 获取日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建一个SysLogHandler,发送日志到系统日志
handler = SysLogHandler(address='/dev/log')
handler.setLevel(logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 添加处理器到日志记录器
logger.addHandler(handler)
# 记录不同级别的日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
在 Debian 中,SysLogHandler(address='/dev/log') 使用的是本机系统日志服务默认套接字路径 /dev/log。这也是本文环境下最关键的一处系统相关配置。
如果你运行的不是标准 Debian 主机环境,而是其他发行版、某些容器场景,或日志服务并不监听本地套接字,那么地址可能要调整为网络形式,例如 ('/localhost', 514)。因此,是否接入 syslog,不只是代码层面的决定,也取决于你的部署方式和日志接收端配置。
怎么选:文件日志、轮转还是 syslog
把上面的几种方式放在一起看,实际决策并不复杂:
- 想快速落地、先把日志写出来:使用
logging.basicConfig()配合filename='app.log'。 - 担心磁盘占用、服务会长期运行:增加
RotatingFileHandler,重点控制maxBytes和backupCount。 - 需要和系统日志统一收集、统一管理:使用
SysLogHandler,并确认/dev/log或网络地址是否符合当前环境。
换句话说,Debian 上的 Python 日志配置并没有单一标准答案,而是按场景递进:先保证能记,再控制体积,最后再决定是否并入系统日志。只要把这三层关系理顺,后续无论是本地脚本、守护进程还是服务化应用,都能搭出一套更稳定的日志方案。













