温馨提示×

nohup日志如何做切割

小樊
43
2026-08-20 10:29:29
栏目: 编程语言

nohup 本身不会自动切割日志,只会把输出追加到 nohup.out(或你重定向的文件)。要实现日志切割(rotate),常见做法有下面几种,按推荐程度排序。


✅ 方式一:用 logrotate(最推荐,生产环境标准)

这是 最规范、最安全 的方式,适合长期运行的服务。

示例:切割 nohup.out

假设你的日志路径是:

/home/app/nohup.out

1️⃣ 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

/home/app/nohup.out {
    daily               # 每天切割
    rotate 7             # 保留 7 份
    missingok            # 文件不存在也不报错
    notifempty           # 空文件不切割
    compress             # 压缩旧日志
    copytruncate         # 关键点:不重启进程
    dateext              # 日期后缀
    dateformat -%Y%m%d
}

2️⃣ 测试是否生效

logrotate -d /etc/logrotate.d/myapp

✅ 优点

  • 不依赖程序支持
  • 不需要重启进程
  • 自动压缩、清理

⚠️ 注意

  • copytruncate 可能导致极少量日志丢失(通常可接受)

✅ 方式二:用 cronolog(适合实时按时间切割)

适合你一开始就知道要按天/小时切日志

1️⃣ 安装

yum install cronolog
# 或
apt install cronolog

2️⃣ 启动程序时直接切日志

nohup ./myapp | cronolog /home/app/logs/myapp-%Y%m%d.log &

✅ 优点

  • 日志天然按时间切
  • 不需要额外切割工具

❌ 缺点

  • 后期换方案不方便
  • 依赖 cronolog

✅ 方式三:自己写脚本 + crontab(不推荐但可用)

示例脚本

#!/bin/bash
LOG=/home/app/nohup.out
mv $LOG $LOG.$(date +%Y%m%d%H%M)
touch $LOG

定时执行

crontab -e
0 3 * * * /home/app/rotate_log.sh

⚠️ 问题

  • 需要 touch 新文件
  • 不如 logrotate 安全

✅ 方式四:避免 nohup.out(最佳实践)

不要直接依赖 nohup.out,而是主动重定向日志。

nohup ./myapp > logs/app.log 2>&1 &

然后:

  • logrotate 管理 logs/app.log
  • 或程序本身支持日志框架(logback / log4j / zap 等)

✅ 推荐方案总结

场景 推荐方案
生产环境 ✅ logrotate
临时脚本 nohup 重定向
实时按时间切 cronolog
长期服务 日志框架 + logrotate

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

  • 你的 系统(CentOS / Ubuntu)
  • 日志路径
  • 是否需要 不重启进程

我可以帮你直接写一份可用的 logrotate 配置。

0