爬虫部署后防止日志文件过大,最推荐在 Linux 服务器上使用系统级的 logrotate 工具,或在代码中配置 logging 模块的轮转 handler。适用场景为长期运行的后台爬虫任务,风险边界在于配置错误可能导致日志丢失或进程无法写入新日志。
先说结论:优先使用系统自带 logrotate 管理文件,代码层作为补充,确保磁盘不被写满。
- 适合:Linux 环境长期运行的爬虫进程,日志量不可控的场景
- 先准备:确认日志文件路径、权限及当前磁盘剩余空间
- 验收:手动触发轮转后检查新文件生成及旧文件归档状态
命令速用版
# Linux logrotate 配置示例 /etc/logrotate.d/crawler
/var/log/crawler/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
# Python logging 轮转配置示例
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10485760, backupCount=5)
为什么会这样
日志文件如果不限制大小或数量,会随运行时间无限增长直至占满磁盘空间。磁盘满了会导致爬虫进程无法写入日志,甚至引发服务崩溃或系统异常。
分步处理
步骤 1:确认日志路径和权限
使用 ls -l 查看日志文件归属,确保运行爬虫的用户有写入权限。
步骤 2:配置 logrotate(推荐)
在 /etc/logrotate.d/ 下新建配置文件,定义轮转频率(daily/weekly)和保留数量(rotate)。
步骤 3:配置代码层轮转(可选)
若无法使用系统工具,在代码中初始化 logger 时加入 RotatingFileHandler 或 TimedRotatingFileHandler。
步骤 4:设置信号处理(重要)
若使用 logrotate 的 copytruncate 模式无需重启进程,否则需确保进程能接收 HUP 信号重新打开文件句柄。
怎么验证是否生效
执行 logrotate -f /etc/logrotate.d/crawler 强制触发轮转。使用 ls -lh 查看是否生成带时间戳或序号的旧日志文件。使用 df -h 确认磁盘使用率未异常升高。
常见坑
- 文件句柄未释放:轮转后进程仍向旧文件写入,导致新日志为空,需配置 copytruncate 或发送 kill -HUP。
- 权限错误:轮转后生成的新文件权限不对,导致爬虫无权写入,需在配置中指定 create 权限。
- 压缩占用 CPU:开启 compress 会消耗 CPU 资源,高负载服务器建议延迟压缩或使用 uncompressed 保留近期日志。
常见问题
日志轮转后旧文件不见了?
检查 rotate 参数设置的数量,超过保留数量的旧日志会被自动删除。
Python 爬虫需要重启才能生效轮转吗?
使用 logging 模块的 handler 配置不需要重启,使用系统 logrotate 且未配置 copytruncate 时需要发送信号或重启。
如何防止日志占满磁盘?
设置 maxBytes 限制单文件大小,设置 rotate 或 backupCount 限制文件总数量,并监控磁盘使用率。
参考来源
- Python Documentation - logging.handlers https://docs.python.org/3/library/logging.handlers.html
- Linux man page - logrotate https://linux.die.net/man/8/logrotate