OBS 生命周期规则:让过期日志自己过期,不用再手动删
一、背景:日志堆在对象存储里为什么是个麻烦
把应用日志、访问日志往对象存储(OBS)里写,是很多团队默认的做法——便宜、稳、不占服务器磁盘。但日志的特点是只进不出:今天写一份、明天写一份,一个月下来桶里可能多出几千个对象,容量计费跟着涨,真要找某一天的日志时还得翻半天。
手动去控制台点选删除,数量少还能忍;对象一多,根本不现实,而且容易误删。其实 OBS 自带一个功能专门解决这类问题,叫生命周期规则(Lifecycle Rule):你定一条"前缀是 logs/ 的对象,超过 30 天就过期删除"的规则,平台到点自动帮你清理,完全不用人工干预。
这篇文章就把这条规则的玩法讲清楚,包含控制台配置和命令行两种方式,以及几个容易踩的坑。
二、生命周期规则到底能做什么
生命周期规则不是只能"删除"。它针对的是"对象随时间推移应该怎么处理"这件事,常见动作有四类:
| 动作 | 含义 | 典型用途 |
|---|---|---|
| 过期删除(Expiration) | 到指定天数后直接删除对象 | 清理临时日志、备份 |
| 转存储类别(Transition) | 到指定天数后从小桶转低频/归档存储 | 热数据转冷,降成本 |
| 清理碎片(AbortIncompleteMultipartUpload) | 删除未完成的分片上传 | 避免大文件分片残留占空间 |
| 基于前缀/标签筛选 | 只对符合规则的子集生效 | 不同目录不同策略 |
要注意的是,"转存储类别"和"删除"是两件事。转存储类别只是把对象从标准存储挪到更便宜的归档存储,对象还在;只有"过期删除"才会真正清掉它。日志清理一般只关心删除,所以下面例子以过期删除为主。
三、在控制台配置一条清理规则
最直观的方式是控制台,步骤如下:
- 登录 OBS 控制台,进入目标桶的详情页。
- 左侧菜单找到「生命周期」并点击,再点「创建规则」。
- 规则名称随便填,比如
expire-logs;状态保持「启用」。 - 作用范围选「按前缀」,填
logs/(注意斜杠,表示只匹配这个目录下的对象)。 - 过期时间填
30,意思是对象最后修改时间超过 30 天后自动删除。 - 如果还想清理大文件的分片上传残留,把「碎片管理」也打开,设为 7 天。
- 确认无误点「创建」,规则立即生效(实际清理动作通常在次日统一执行)。
这里的前缀 logs/ 必须和你的对象键(Key)对得上。假如你的日志上传时 key 是 app/logs/2026-08-30.log,那前缀就得写 app/logs/ 才能命中,写成 logs/ 就匹配不到。这是最常见的配置失误。
四、用命令行配置,更适合写进自动化
图形界面点一次能解决一个桶,但如果你管着十几个桶、或者想把它写进基础设施即代码(IaC)脚本里,命令行更合适。OBS 的生命周期规则用一段 XML 描述,下面这段表示"logs/ 前缀的对象 30 天过期、分片 7 天清理":
<LifecycleConfiguration>
<Rule>
<ID>expire-logs</ID>
<Prefix>logs/</Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>30</Days>
</Expiration>
<AbortIncompleteMultipartUpload>
<DaysAfterInitiation>7</DaysAfterInitiation>
</AbortIncompleteMultipartUpload>
</Rule>
</LifecycleConfiguration>
把上面内容存成 lifecycle.xml,用 KooCLI 提交给指定桶:
hcloud obs lifecycle put --bucket my-log-bucket --body ./lifecycle.xml
--bucket 换成你自己的桶名即可。提交成功后,可以用 hcloud obs lifecycle get --bucket my-log-bucket 把当前规则拉回来核对。SDK 侧(Java/Python/Go 等)也是同样的 XML 结构,只是包成了对应语言的客户端方法,字段名一一对应。
五、几个容易踩的坑
第一,规则不是实时删除。OBS 的生命周期清理是批处理任务,一般每天跑一次,所以你今天设了 30 天过期,第 31 天才会被清,不是一跨过午夜立刻没。别因为"设了怎么还没删"就以为配置失败的。
第二,前缀大小写和斜杠敏感。Logs/ 和 logs/ 是不同的;漏了结尾斜杠可能把同名文件也误伤。建议先用 hcloud obs lifecycle get 看实际生效的规则,或者在测试桶里放一个对象验证逻辑再上生产。
第三,转存储类别和删除别混为一谈。如果你只想要"降成本保留",用 Transition 转到归档;如果确实不要了,才用 Expiration。两者可以同一条规则里共存(先转冷、再删除),但顺序要想清楚。
第四,多规则之间是叠加的。桶里可以有多条生命周期规则,对象只要命中任意一条的删除条件就会被删。规则多了之后,建议用统一的命名规范(比如按业务前缀命名),免得自己都忘了哪条在管什么。
六、小结
日志进对象存储容易,出对象存储难,生命周期规则就是补上"出"这一环的。核心就三件事:想清楚是按前缀还是按标签筛选、想清楚是转冷还是直接删、想清楚保留多少天。配置完用命令行拉一次核对,比在控制台凭记忆点更靠谱。这种"设一次、长期自动跑"的能力,本质上就是把运维里最无聊的清理动作,交给平台按时执行,人只负责定规则。
- 点赞
- 收藏
- 关注作者
评论(0)