Linux logrotate配合postrotate通知服务重开日志的配置
我在排查“日志文件已经被改名,服务却还在往旧文件写”的问题时,最后把责任拆成两段:logrotate 负责完成轮转,服务负责重新打开同名的新文件。配置的关键不是简单加一条重启命令,而是让 postrotate 只在真的发生轮转后发出服务能理解的重开信号。
官方地址:https://github.com/logrotate/logrotate/
- 用
sharedscripts把通配路径匹配到的多份日志合并成一次通知。 postrotate不是无条件执行;没有文件需要轮转时不会运行。- 先用调试模式看判断结果,再用强制运行和文件增长确认服务已经切到新文件。
先把轮转和重开职责分开
常见场景是服务持续打开 /var/log/myapp/app.log。logrotate 把它改名为 app.log.1,再创建新的 app.log;但进程手里的文件描述符仍然指向旧 inode。此时目录里虽然出现了新文件,服务并不会自动切换。
因此重开动作必须由服务提供支持。优先确认单元的文档或启动脚本是否约定了 HUP、reload 或专用管理命令。不要把“重启服务”当成通用替代品:它会带来连接中断,且未必比重新打开日志更安全。

用 sharedscripts 控制 postrotate 的触发次数
一个配置可能匹配 app.log、access.log 和 error.log。默认情况下,脚本可能按每个实际轮转的文件触发;服务却通常只需要一次重开。把 sharedscripts 放在脚本块前,可以让这一组匹配文件共用一次 postrotate,减少重复信号。
/var/log/myapp/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
# 仅在本组至少有一份日志完成轮转后,通知主进程重开日志
systemctl kill -s HUP --kill-who=main myapp.service
endscript
}
这里的 delaycompress 让刚轮转的上一份日志暂不立即压缩,便于某些仍需短暂读取旧文件的流程;它不是重开信号的替代品。若服务不识别 HUP,应把命令换成该服务明确支持的 reload 方式。
用调试模式确认 logrotate 真的会执行脚本
“postrotate 没反应”经常不是脚本坏了,而是当前轮转周期、文件大小或 notifempty 条件没有满足。先只做判断,不改文件:
# -d 只展示解析与轮转判断,不实际改名、压缩或发送信号
sudo logrotate -d /etc/logrotate.d/myapp
# 需要一次演练时再强制执行;执行前确认测试路径和服务名称
sudo logrotate -f /etc/logrotate.d/myapp
调试输出应能看到配置被读取、目标日志的轮转判断,以及是否跳过脚本。强制运行会改变日志文件,最好在维护窗口使用,并先保留当前配置副本。

三类现象对应三种修复动作
| 现象 | 先看什么 | 处理方向 |
|---|---|---|
| 没有看到 postrotate 输出 | 调试输出、周期、文件大小、notifempty | 先确认是否真的发生轮转,不要先改信号命令 |
| 出现 shared postrotate script error | systemctl 状态、单元名、信号权限 | 修正服务单元或改用支持的 reload 命令 |
| 新文件不增长,旧文件继续变大 | 文件 inode、服务日志、重开后状态 | 确认服务能重开日志,并在新文件产生写入后再收尾 |
如果服务使用独立用户运行,systemctl kill 往往比直接读取 PID 文件更不容易拿错进程;若只能使用 PID 文件,脚本必须检查文件非空、进程存在和退出码,避免把陈旧 PID 发给其他进程。
上线前留下可回滚的检查清单
- 配置文件能被
logrotate -d正常解析,花括号和endscript成对。 - 服务单元名称、运行用户和重开信号已经与实际部署一致。
- 强制演练后,旧日志被保留,新日志文件出现,且服务日志没有报告 reload 失败。
- 观察一个自然周期,确认新文件持续增长;异常时先移除或恢复该配置,再检查服务自身日志。
常见问题
postrotate 会在每次定时任务都执行吗?
不会。目标文件没有满足轮转条件时,脚本不会执行;满足条件时才会在轮转后运行。
sharedscripts 是不是必须配置?
不是。只有一个日志文件时通常无须它;通配符匹配多文件并且服务只需一次重开时,它能避免重复通知。
发 HUP 后仍然写旧日志怎么办?
先确认服务是否把 HUP 定义为重开日志,再检查信号是否发给正确的主进程。若服务不支持 HUP,应改用官方约定的 reload 入口。
Go regexp命名分组提取日志字段的维护方式
- 上一篇
- Go regexp命名分组提取日志字段的维护方式
- 下一篇
- Go io.ReadAll处理无界响应时的内存保护方案
-
- 文章 · linux | 2小时前 | Linux · 运维排查 · Linux systemd journalctl 日志过滤
- Linux journalctl按服务与时间窗口过滤日志的命令组合
- 495浏览 收藏
-
- 文章 · linux | 3小时前 | linux运维 · Linux systemd 启动顺序 network.target network-online.target
- Linux systemd依赖网络就绪状态的启动顺序配置
- 496浏览 收藏
-
- 文章 · linux | 4小时前 | Linux · Linux 环境变量 systemd EnvironmentFile
- Linux systemd用EnvironmentFile处理带空格值的配置方法
- 204浏览 收藏
-
- 文章 · linux | 9小时前 | Linux · Linux tar strip-components GNU tar
- Linux tar用 strip-components 控制解包目录层级的实现方法
- 104浏览 收藏
-
- 文章 · linux | 11小时前 | Linux 文件句柄 ulimit /proc/PID/limits Max open files
- Linux /proc/PID/limits核对服务实际文件句柄上限的实现方法
- 253浏览 收藏
-
- 文章 · linux | 12小时前 |
- Linux mount namespace选择 shared、private 与 slave 传播属性的实现方法
- 204浏览 收藏
-
- 文章 · linux | 13小时前 | Linux · 策略路由 ip rule Linux ip route fibmatch
- Linux ip route读取策略路由表的命中路径的实现方法
- 451浏览 收藏
-
- 文章 · linux | 4天前 | Linux · IN_Q_OVERFLOW Linux inotify inotify事件丢失 Linux目录监控 inotify重扫
- Linux inotify处理目录监控事件丢失风险的实现方法
- 223浏览 收藏
-
- 文章 · linux | 4天前 | Linux · Linux OOM cgroup v2 memory.events oom_kill
- Linux cgroup v2用 memory.events 区分 oom 与 oom_kill的实现方法
- 281浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 135次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 200次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 146次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 125次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 111次使用
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- golang之log rotate详解
- 2023-01-13 467浏览

