日志保留
2025-12-09 04:55:38
文档 Grafana Loki 管理 存储 日志保留开源 日志保留Grafana Loki 中的保留通过 Compactor 实现。默认情况下未设置 compactor.retention-enabled 标志,因此发送到 Loki 的日志会永久保留。
注意
如果您在对象存储上配置了生命周期策略,请确保其时长长于保留期限。
Compactor 还支持按租户或按流级别应用细粒度保留策略。
注意
Compactor 不支持对旧式索引类型进行保留。在使用旧式索引类型时,请使用Table Manager。Table Manager 和旧式索引类型均已弃用,并可能在 Loki 的未来主要版本中移除。
CompactorCompactor 负责索引文件的压缩和日志保留的实施。
注意
将 Compactor 作为单例运行(一个实例)。
Compactor 循环在每个 compactor.compaction-interval 间隔应用压缩和保留,如果落后则尽快应用。压缩和保留都是幂等的。如果 Compactor 重启,它将从上次中断的地方继续。
Compactor 应用保留的算法如下:
对于每一天或每个表(每个表对应一天,索引周期为 24 小时)将表中的多个索引文件压缩成每个租户一个索引文件。压缩结果是每个租户每天一个索引文件。遍历每个租户的索引。使用租户配置识别需要移除的 chunk。从索引中移除对匹配 chunk 的引用,并将 chunk 引用添加到磁盘上的标记文件。上传新的修改后的索引文件。在对索引应用保留算法时,chunk 并不会被删除。它们由 sweeper 进程异步删除,此延迟可通过设置 -compactor.retention-delete-delay 进行配置。标记文件用于跟踪待删除的 chunk。
出于以下原因,chunk 不能立即删除:
Index Gateway 下载索引文件的副本以服务查询,并定期刷新它们。设置延迟允许 Index Gateway 拉取修改后的索引文件,这些文件将不包含对标记删除的 chunk 的任何引用。如果没有延迟,Gateway 上过时的索引文件可能会引用已删除的 chunk,从而导致查询失败。
它提供了一个短暂的时间窗口,以便在配置错误时取消 chunk 删除。
标记文件应存储在持久磁盘上,以确保即使 Compactor 进程重启,待删除的 chunk 也能被处理。
注意
Grafana Labs 建议将 Compactor 作为有状态部署运行(使用 Kubernetes 时为 StatefulSet),并使用持久存储来存储标记文件。
保留配置此 Compactor 配置示例激活保留功能。
yaml 复制compactor:
working_directory: /data/retention
compaction_interval: 10m
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 150
delete_request_store: gcs
schema_config:
configs:
- from: "2020-07-31"
index:
period: 24h
prefix: index_
object_store: gcs
schema: v13
store: tsdb
storage_config:
tsdb_shipper:
active_index_directory: /data/index
cache_location: /data/index_cache
gcs:
bucket_name: loki注意
仅当索引周期为 24 小时时,保留功能才可用。单存储 TSDB 和单存储 BoltDB 需要 24 小时索引周期。
retention_enabled 应设置为 true。否则,Compactor 只会压缩表。
delete_request_store 应设置为配置删除请求的存储。启用保留时必须设置此项。
working_directory 是用于保存标记的 chunk 和临时表的目录。
compaction_interval 指定应用压缩和/或保留的频率。如果 Compactor 落后,则尽快进行压缩和/或保留。
retention_delete_delay 是 Compactor 删除标记的 chunk 之前的延迟。
retention_delete_worker_count 指定实例化用于删除 chunk 的 goroutine worker 的最大数量。
配置保留期限保留期限在 limits_config 配置部分进行配置。
设置保留策略有两种方式
retention_period 应用于所有日志流的全局保留期限。retention_stream 仅应用于匹配选择器的日志流。注意
最小保留期限为 24 小时。
此示例配置了应用于所有租户的全局保留(除非通过配置每个租户的覆盖进行覆盖)
yaml 复制...
limits_config:
retention_period: 744h
retention_stream:
- selector: '{namespace="dev"}'
priority: 1
period: 24h
per_tenant_override_config: /etc/overrides.yaml
...注意
您只能在 retention_stream 定义的 selector 字段中使用标签匹配器。不支持任意 LogQL 表达式。
可以通过配置运行时覆盖来定义每个租户的保留。例如
yaml 复制overrides:
"29":
retention_period: 168h
retention_stream:
- selector: '{namespace="prod"}'
priority: 2
period: 336h
- selector: '{container="loki"}'
priority: 1
period: 72h
"30":
retention_stream:
- selector: '{container="nginx", level="debug"}'
priority: 1
period: 24h给定流的保留期限根据此列表中的第一个匹配项决定
如果多个每个租户的 retention_stream 选择器匹配该流,则选择优先级最高的保留期限。如果多个全局 retention_stream 选择器匹配该流,则选择优先级最高的保留期限。如果设置了每个租户的 retention_stream,则不考虑此值。如果指定了每个租户的 retention_period,则将应用它。如果没有匹配上述任何规则,将应用全局 retention_period。如果未指定全局 retention_period,则使用默认值 744h (30 天) 保留。注意
优先级值越大,优先级越高。
流匹配使用与 Prometheus 标签匹配相同的语法
=: 选择与提供的字符串完全相等的标签。!=: 选择与提供的字符串不相等的标签。=~: 选择与提供的字符串正则表达式匹配的标签。!~: 选择与提供的字符串正则表达式不匹配的标签。上面定义的示例配置将导致以下保留期限
对于租户 29具有命名空间标签 prod 的流将有 336h (2 周) 的保留期限,即使容器标签是 loki,因为 prod 规则的优先级更高。具有容器标签 loki 但不在命名空间 prod 中的流将有 72h 的保留期限。对于此租户中的其余流,将应用每个租户覆盖的 retention_period 值 168h。对于租户 30具有标签 nginx 和级别 debug 的流将有 24h 的保留期限。对于此租户中的其余流,将应用全局保留期限 744h,因为没有指定覆盖。除 29 和 30 外的所有租户具有命名空间标签 dev 的流将有 24h 的保留期限。除具有命名空间标签 dev 的流外,其他流将有 744h 的保留期限。表管理器(已弃用)通过表管理器实现的保留依赖于对象存储 TTL 功能,并且适用于boltdb-shipper 存储以及 chunk/索引存储。
为了启用保留支持,需要配置表管理器以启用删除和保留期限。请参阅 Loki 配置参考的table_manager 部分,了解所有可用选项。另外,可以使用 table-manager.retention-period 和 table-manager.retention-deletes-enabled 命令行标志。提供的保留期限需要是一个字符串表示的持续时间,可以使用 Prometheus 通用模型 ParseDuration 进行解析。示例:7d, 1w, 168h。
警告
保留期限必须是period_config 块中配置的索引和 chunk 表 period 的倍数。更多信息请参阅表管理器文档。
注意
为避免查询超出保留期限的数据,limits_config 中的 max_query_lookback 配置必须设置为小于或等于 table_manager.retention_period 中设置的值。
使用 S3 或 GCS 时,存储 chunk 的 bucket 需要正确设置过期策略。更多详细信息请查阅S3 文档或GCS 文档。
如果您必须删除已摄取的日志,可以在对象存储中删除旧的 chunk。但请注意,这只会删除日志内容并保留标签索引不变;您仍然可以看到相关的标签,但无法检索已删除的日志内容。
有关表管理器内部机制的更多详细信息,请参阅表管理器文档。
另外,如果为索引存储配置了 BoltDB Shipper,您可以启用日志条目删除来删除特定流的日志条目。
配置示例使用 GCS 并设置 28 天保留期的配置示例
yaml 复制schema_config:
configs:
- from: 2018-04-15
store: tsdb
object_store: gcs
schema: v13
index:
prefix: loki_index_
period: 24h
storage_config:
tsdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/index_cache
gcs:
bucket_name: GCS_BUCKET_NAME
limits_config:
max_query_lookback: 672h # 28 days
retention_period: 672h # 28 days
compactor:
working_directory: /data/retention
delete_request_store: gcs
retention_enabled: true