温馨提示×

nohup日志如何按日期保存

小樊
40
2026-07-21 17:51:42
栏目: 编程语言

在 Linux 下使用 nohup 运行程序时,默认只会把日志输出到一个固定文件(如 nohup.out),它不会自动按日期切分。要实现按日期保存日志,常见有以下几种做法,从简单到规范依次说明。


✅ 方法一:启动命令中直接按日期命名(最简单)

在启动命令里用日期变量给日志文件命名:

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

说明

  • $(date +%Y%m%d):当天日期,如 20260121
  • 每次启动都会生成一个新的日志文件
  • 适合每天只启动一次的场景

⚠️ 缺点:

  • 如果程序一直运行,日志不会自动按天切分
  • 需要每天重启才能生成新文件

✅ 方法二:配合 cron 每天生成新日志(推荐)

1️⃣ 启动程序(日志写到一个固定文件)

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

2️⃣ 用 cron 凌晨切分日志

0 0 * * * mv app.log app_$(date +\%Y\%m\%d).log && touch app.log

⚠️ 注意:

  • cron% 需要转义
  • 程序需要支持重新打开日志文件(否则可能继续写旧文件)

✅ 方法三:使用 logrotate(生产环境最推荐 ✅)

这是最规范、最常用的方式。

1️⃣ 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

/path/to/app.log {
    daily
    rotate 30
    missingok
    notifempty
    dateext
    dateformat -%Y%m%d
    copytruncate
}

2️⃣ 参数说明

参数 说明
daily 每天切分
rotate 30 保留 30 天
dateext 使用日期作为后缀
copytruncate 不重启程序直接切日志
notifempty 空文件不切

3️⃣ 测试

logrotate -f /etc/logrotate.d/myapp

✅ 优点:

  • 不需要改程序
  • 自动按天切分
  • 支持压缩、清理旧日志

✅ 方法四:直接输出到带日期的文件(不推荐长期运行)

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

仅适合短任务或测试环境


✅ 推荐方案总结

场景 推荐方式
测试 / 临时 方法一
简单服务 方法二
生产环境 ✅ 方法三(logrotate)
定时任务 cron + 重定向

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

  • 程序类型(Java / Python / Shell)
  • 是否 7×24 运行
  • 是否需要压缩或保留天数

我可以帮你写一份完全可用的 logrotate 配置

0