温馨提示×

nohup日志如何按天切割

小樊
42
2026-08-20 09:03:20
栏目: 编程语言

nohup 本身不会按天切割日志,它只是把输出重定向到 nohup.out。要实现按天切割 nohup 日志,常用有以下几种方案,从简单到规范依次说明。


✅ 方案一:启动时就按天输出(最简单,推荐)

启动命令时直接按日期生成日志文件:

nohup java -jar app.jar > logs/app_$(date +%Y-%m-%d).log 2>&1 &

缺点

  • 只在启动时生成一次文件名
  • 第二天不会自动切换新文件

适合每天重启服务的场景


✅ 方案二:用 cron 定时切割 nohup.out(常用)

1️⃣ 假设日志文件

nohup java -jar app.jar > nohup.out 2>&1 &

2️⃣ 编写切割脚本 cut_nohup.sh

#!/bin/bash

LOG_DIR=/path/to/logs
DATE=$(date +%Y-%m-%d)

mv $LOG_DIR/nohup.out $LOG_DIR/nohup_$DATE.log

# 让程序继续写新的 nohup.out
touch $LOG_DIR/nohup.out

3️⃣ 加执行权限

chmod +x cut_nohup.sh

4️⃣ 配置 crontab(每天 0 点切割)

0 0 * * * /path/to/cut_nohup.sh

优点:简单、稳定
⚠️ 注意

  • 某些程序不会自动使用新的 nohup.out
  • 并不是所有程序都支持日志文件被 mv 后继续写

✅ 方案三:用 logrotate(生产环境推荐 ✅)

这是最标准、最专业的做法。

1️⃣ 假设日志路径

/path/to/logs/nohup.out

2️⃣ 创建 logrotate 配置

vim /etc/logrotate.d/nohup

内容示例:

/path/to/logs/nohup.out {
    daily
    rotate 30
    missingok
    notifempty
    compress
    copytruncate
    dateext
    dateformat -%Y-%m-%d
}

3️⃣ 参数解释

参数 说明
daily 每天切割
rotate 30 保留 30 天
compress 压缩旧日志
copytruncate 不重启程序直接切割
dateext 按日期命名

4️⃣ 测试

logrotate -vf /etc/logrotate.d/nohup

优点

  • 不重启应用
  • 自动清理旧日志
  • 生产环境首选

✅ 方案四:不用 nohup,用 systemd(最佳实践)

如果可以,不要用 nohup + 日志切割,而是用 systemd。

[Service]
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log

然后配合 logrotate


✅ 对比总结

方案 适合场景 推荐度
启动时按天 简单脚本 ⭐⭐
cron 手动切割 老项目 ⭐⭐⭐
logrotate 生产环境 ⭐⭐⭐⭐⭐
systemd 新服务 ⭐⭐⭐⭐⭐

如果你愿意,可以告诉我:

  • Java / Python / Shell / Node 哪个?
  • 是否 不能重启服务
  • 日志是 nohup.out 还是其他文件?

我可以帮你给出完全可直接用的脚本或配置

0