在 Linux 下使用 nohup 运行程序时,默认只会把日志输出到一个固定文件(如 nohup.out),它不会自动按日期切分。要实现按日期保存日志,常见有以下几种做法,从简单到规范依次说明。
在启动命令里用日期变量给日志文件命名:
nohup java -jar app.jar > app_$(date +%Y%m%d).log 2>&1 &
$(date +%Y%m%d):当天日期,如 20260121⚠️ 缺点:
cron 每天生成新日志(推荐)nohup java -jar app.jar >> app.log 2>&1 &
cron 凌晨切分日志0 0 * * * mv app.log app_$(date +\%Y\%m\%d).log && touch app.log
⚠️ 注意:
cron 里 % 需要转义logrotate(生产环境最推荐 ✅)这是最规范、最常用的方式。
sudo vim /etc/logrotate.d/myapp
内容示例:
/path/to/app.log {
daily
rotate 30
missingok
notifempty
dateext
dateformat -%Y%m%d
copytruncate
}
| 参数 | 说明 |
|---|---|
daily |
每天切分 |
rotate 30 |
保留 30 天 |
dateext |
使用日期作为后缀 |
copytruncate |
不重启程序直接切日志 |
notifempty |
空文件不切 |
logrotate -f /etc/logrotate.d/myapp
✅ 优点:
nohup ./app.sh > app_$(date +%Y-%m-%d).log 2>&1 &
仅适合短任务或测试环境
| 场景 | 推荐方式 |
|---|---|
| 测试 / 临时 | 方法一 |
| 简单服务 | 方法二 |
| 生产环境 | ✅ 方法三(logrotate) |
| 定时任务 | cron + 重定向 |
如果你愿意,可以告诉我:
我可以帮你写一份完全可用的 logrotate 配置。