本文介绍使用 nohup + tail + logrotate 实现简单稳定的 Python 服务日志管理方案。
一、Python 程序后台运行
普通执行:
python3 app.py
当关闭 SSH 连接后,程序会停止运行。
可以使用 nohup 将程序放到后台运行:
nohup python3 -u app.py > /root/logs/app.log 2>&1 &
如果是uvicorn 不需要 -u 本来就是实时输出的
nohup uvicorn main:app --host 0.0.0.0 --port 8000 > /root/logs/app.log 2>&1 &
参数说明:
| 参数 | 作用 |
|---|---|
| nohup | 退出 SSH 后程序继续运行 |
| -u | Python 无缓冲模式,日志实时写入 |
| > app.log | 保存程序输出日志 |
| 2>&1 | 错误日志一起写入 |
| & | 后台运行 |
其中:
-u
表示 Python 使用 unbuffered(无缓冲)模式。
开启后:
print()输出立即写入日志tail -f可以实时看到最新内容- 更适合长期运行的后台任务
二、实时查看运行日志
程序启动后,可以通过:
tail -f /root/logs/app.log
实时查看运行状态。
例如:
正在启动服务...
连接数据库成功
任务执行中...
日志会不断刷新。
退出查看:
Ctrl + C
三、配置日志自动清理
如果程序长期运行:
app.log
会不断增大。
当日志达到几个 GB 时,会占用大量磁盘空间。
可以使用 Linux 自带的 logrotate 自动管理。
创建配置文件:
vim /etc/logrotate.d/app
写入:
/root/logs/*.log {
daily
rotate 7
compress
missingok
copytruncate
dateext
dateformat -%Y-%m-%d
}
copytruncate 防止 Python 进程还占用旧文件句柄 写入新文件失败 不重启程序切割日志。
每天一个文件最多7天
四、logrotate 配置说明
每天检查日志
daily
每天执行一次日志检查。
限制日志大小
size 100M
当日志超过 100MB 时自动切割。
保留历史日志
rotate 7
最多保留 7 个旧日志:
app.log
app.log.1.gz
app.log.2.gz
...
app.log.7.gz
超过后自动删除。
压缩旧日志
compress
旧日志自动压缩:
app.log.1
↓
app.log.1.gz
减少磁盘占用。
不重启程序切割日志
copytruncate
轮转日志时:
- 复制旧日志
- 清空当前日志文件
程序无需停止或重启。
适合:
- Python 脚本
- 爬虫程序
- 后台任务
- nohup 启动程序
五、测试日志轮转
查看配置是否正确:
logrotate -d /etc/logrotate.d/app
立即执行轮转:
logrotate -f /etc/logrotate.d/app
查看日志目录:
ls -lh /root/logs/
六、完整使用流程
1. 启动 Python 程序
nohup python3 -u app.py > /root/logs/app.log 2>&1 &
2. 查看实时日志
tail -f /root/logs/app.log
3. 自动日志管理
系统每天自动执行:
app.log
|
| 超过100MB
↓
app.log.1.gz
app.log.2.gz
...
app.log.7.gz
自动保留最近 7 份日志,避免日志无限增长。
七、如何一键重启
kill 是 根据PID查询 pkill是根据 根据进程名/匹配规则搜索(所以最好先ps -ef|grep "xxx" 看一下是不是自己要的进程)
pkill -f "python3 -u app.py"; nohup python3 -u app.py > /root/logs/app.log 2>&1 &
pkill -f "uvicorn main:app"; nohup uvicorn main:app --host 0.0.0.0 --port 8000 > /root/logs/app.log 2>&1 &
总结
通过:
nohup实现 Python 程序后台运行python3 -u保证日志实时输出tail -f实时查看运行状态logrotate(log 肉泰特)自动切割和删除日志
可以快速搭建一个简单可靠的 Python 服务运行环境,适合服务器脚本、爬虫、API 服务和定时任务等场景。