温馨提示×

nohup日志怎样按天切割

小樊
40
2026-09-18 14:32:48
栏目: 编程语言

nohup 本身不会自动按天切割日志,它只是把输出重定向到文件(如 nohup.out)。要实现按天切割,常见做法有以下几种:


一、使用 logrotate(最推荐,生产环境)

1. 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

示例(假设日志是 /home/user/app/nohup.out):

/home/user/app/nohup.out {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    copytruncate
    notifempty
}

2. 说明

  • daily:每天切割
  • rotate 30:保留 30 天
  • copytruncate:复制后清空原文件(不中断 nohup 进程)
  • compress:压缩旧日志

3. 测试

logrotate -d /etc/logrotate.d/myapp   # 测试
logrotate -f /etc/logrotate.d/myapp   # 强制执行

✅ 优点:标准、稳定、无需改代码
❌ 缺点:需要系统权限


二、启动时就按天写日志(推荐新项目)

不要直接写 nohup.out,而是用日期命名:

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

但这样不会自动跨天切换,需要配合 cron。

配合 cron 重启或 reopen(不推荐重启)

更优雅的是用日志框架(如 logback / log4j2):

logback 示例

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

✅ 最推荐方式(应用层解决)


三、用 cronolog(老方案)

nohup ./app | cronolog /path/logs/app_%Y%m%d.log &

安装:

yum install cronolog
# 或
apt install cronolog

✅ 自动按天
❌ 已多年不活跃维护


四、简单 shell + crontab(土办法)

0 0 * * * mv nohup.out nohup_$(date -d yesterday +%Y%m%d).log

⚠️ 风险:mv 后 nohup 可能继续写旧 fd


✅ 总结建议

场景 推荐方案
已有 nohup 进程 logrotate + copytruncate
新项目 日志框架按天滚动
简单脚本 cronolog

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

  • 是什么程序(Java / Python / Shell)
  • 是否在容器里
  • 是否允许重启服务

我可以给你最合适的方案。

0 踩