日志删除机制
日志管理是分布式系统可观测性的核心部分,而日志删除机制则是确保存储效率和数据合规性的关键。在 Grafana Loki 中,日志删除机制允许用户根据需求清理旧日志,避免存储空间无限增长。本文将介绍 Loki 的日志删除实现方式,包括自动保留策略和手动删除操作。
介绍
Grafana Loki 是一个水平可扩展、高可用的多租户日志聚合系统,专为效率而设计。与其他日志系统不同,Loki 不会索引日志内容,而是通过标签(labels)进行索引。这种设计使其存储成本更低,但也意味着日志删除机制需要特别处理。
日志删除在以下场景中尤为重要:
- 遵守数据保留政策(如 GDPR)
- 控制存储成本
- 清理测试或临时数据
保留策略
Loki 支持基于时间的保留策略,可以全局配置或在租户级别覆盖。保留策略决定了日志在 Loki 中保存的时长。
配置全局保留
在 Loki 的配置文件 loki.yaml
中,可以通过以下方式设置全局保留期:
yaml
table_manager:
retention_deletes_enabled: true
retention_period: 720h # 保留30天(30 * 24小时)
备注
保留期以持续时间字符串表示,支持的单位包括 h
(小时)、d
(天)、w
(周)。
租户级保留
对于多租户部署,可以通过 Compactor 配置覆盖特定租户的保留设置:
yaml
compactor:
override_retention_period:
"tenant-1": 168h # tenant-1 保留7天
"tenant-2": 720h # tenant-2 保留30天
手动删除日志
除了自动保留外,Loki 还提供了 API 用于手动删除日志。
按时间范围删除
使用 Loki 的 delete
API 可以删除特定时间范围内的日志:
bash
curl -X POST \
-H "X-Scope-OrgID: tenant-1" \
-H "Content-Type: application/json" \
-d '{
"query": "{job=\"my-service\"}",
"start": "2023-01-01T00:00:00Z",
"end": "2023-01-31T23:59:59Z"
}' \
http://localhost:3100/loki/api/v1/delete
警告
删除操作是异步的,可能需要一段时间才能反映在查询结果中。
按标签删除
Loki 2.8+ 支持通过日志流选择器删除特定标签的日志:
bash
curl -X DELETE \
-H "X-Scope-OrgID: tenant-1" \
"http://localhost:3100/loki/api/v1/delete?query={job=\"my-service\",env=\"dev\"}"
实际案例
案例1:合规性数据清理
某金融应用需要遵守监管要求,将日志保留期设为1年。配置如下:
yaml
table_manager:
retention_deletes_enabled: true
retention_period: 8760h # 365天
案例2:开发环境每日清理
开发环境日志只需保留7天,且每天凌晨清理测试数据:
bash
# 每日清理超过7天的dev环境日志
curl -X DELETE \
-H "X-Scope-OrgID: dev-team" \
"http://loki:3100/loki/api/v1/delete?query={env=\"dev\"}&end=$(date -d '7 days ago' +%s)000000000"
内部机制
Loki 的删除操作通过以下组件协作完成:
- 标记阶段:将符合条件的数据块标记为待删除
- 压缩阶段:Compactor 定期运行,实际移除被标记的数据
- 存储清理:后端存储(如S3、GCS)中的对象最终被删除
总结
Loki 提供了灵活的日志删除机制:
- 通过保留策略自动清理旧数据
- 支持精确的手动删除(按时间或标签)
- 多租户场景下可定制保留期
延伸学习
- 练习:配置一个保留策略,自动删除超过14天的日志
- 进阶:使用 Loki 的
metrics
API 监控删除操作的状态 - 官方文档:Loki Retention