好睿思指南
霓虹主题四 · 更硬核的阅读氛围

日志轮转中postrotate的作用详解

发布时间:2025-12-13 11:20:26 阅读:34 次

ref="/tag/415/" style="color:#E3A3CF;font-weight:bold;">日志轮转中postrotate的作用详解

在运维工作中,服务器上的日志文件每天都在不断增长。比如一个Web服务,访问量一大,access.log一天就能涨到几个GB。如果不做处理,磁盘迟早会被撑爆。于是就有了日志轮转(log rotation)这回事——定期把旧日志打包归档,腾出空间给新日志用。

常见的轮转工具是logrotate,它不仅能切分日志,还能在切完之后执行一些自定义操作。这时候,postrotate指令就派上用场了。

postrotate是干什么的?

简单说,postrotate和endscript之间的内容,会在日志完成轮转后自动执行一次。这个“之后”很关键——也就是旧日志已经重命名,新的空日志文件已经创建完毕的时候。

最常见的用途就是通知服务重新打开日志文件。比如Nginx,它写日志时并不是每次都打开文件,而是保持一个文件句柄长期写入。一旦你手动把access.log改名,Nginx还在往那个已经被移走的文件里写,新日志反而没人写。这时候就得发个信号让它“换笔”,也就是重新加载日志句柄。

实际配置例子

看一个典型的Nginx日志轮转配置:

/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}

这里的postrotate块告诉logrotate:轮转完成后,执行systemctl reload nginx。reload不是重启服务,只是让进程重新读取配置并打开新的日志文件,对线上服务几乎无影响。

如果不加这一段,你会发现日志文件虽然按天生成了access.log.1、access.log.2这样的归档文件,但新的access.log始终是空的——因为Nginx根本没往里面写。

其他常见使用场景

除了Web服务器,像Java应用跑在Tomcat里,也常配合postrotate发送SIGHUP或调用脚本清理缓存。有些自研服务没有内置日志重载机制,也可以在这里调用自己的刷新逻辑。

注意一点:如果配置里有多个日志文件匹配规则,且没加sharedscripts,那postrotate会每个文件都执行一遍。加上sharedscripts后,整个块只执行一次,更安全高效。

还有些人喜欢在里面加邮件通知、日志分析脚本触发,甚至是上传到备份服务器的命令。只要别太耗时,都是合理操作。

总之,postrotate就是那个“事情办完后顺手收个尾”的小助手。别小看这几行脚本,少了它,日志轮转可能只完成了一半。