在 CentOS 下使用 nohup 运行程序时,日志默认会写入 nohup.out,但它不会自动滚动,时间久了会越来越大。下面给你几种常用且实用的日志滚动方案,从简单到规范。
nohup java -jar app.jar > app.log 2>&1 &
mv app.log app.log.20260121
touch app.log
kill -USR1 $(pidof java)
⚠️ 只有部分程序(如 Java、Nginx)支持
USR1重新打开日志文件
不支持的程序需要重启
logrotate(最标准)这是 CentOS 官方推荐 的日志滚动方式,适合生产环境。
yum install -y logrotate
vim /etc/logrotate.d/myapp
示例(非常常用):
/opt/app/app.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
dateext
}
| 参数 | 作用 |
|---|---|
| daily | 每天滚动 |
| rotate 7 | 保留 7 份 |
| missingok | 日志不存在也不报错 |
| notifempty | 空文件不滚动 |
| compress | 压缩旧日志 |
| copytruncate | 复制后清空(无需重启) |
| dateext | 日期后缀 |
logrotate -vf /etc/logrotate.d/myapp
如果你运行的是 Java 程序,千万不要只靠 nohup.out
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
然后:
nohup java -jar app.jar >/dev/null 2>&1 &
✅ 专业、稳定、不丢日志
0 0 * * * mv /opt/app/app.log /opt/app/app.log.$(date +\%F)
⚠️ 缺点:
| 场景 | 推荐方案 |
|---|---|
| 普通脚本 | logrotate + copytruncate |
| Java 程序 | logback / log4j2 |
| 临时测试 | 重定向日志 |
| 生产环境 | ✅ logrotate |
如果你愿意,可以把你的 启动命令 / 程序类型(Java / Python / Shell) 发出来,我可以帮你写一份完全可用的 logrotate 配置。