如何用Loki、Promtail查看EKS中S3存储的SpringBoot日志及目录解析
Loki S3存储结构与日志访问详解
一、S3桶内目录/文件的作用与内容
1. fake 目录
- 作用:Loki单节点模式下的占位目录,用来模拟分布式集群的索引分片结构,在EKS多节点集群中无实际作用,可忽略。
- 内容:一般为空,或仅含空文件,不存储任何有效日志或索引数据。
2. index 目录
- 作用:存储Loki的日志索引核心数据,负责映射日志标签、时间范围与S3中日志块的存储路径,是快速查询日志的关键。
- 内容:包含按时间分片的boltdb-shipper格式文件(
.db、.tmp等),记录了日志元数据与对应块的关联信息。
3. loki_cluster_seed.json 文件
- 作用:用于Loki集群的节点初始化与发现,提供集群初始节点的元数据,帮助新节点快速加入集群同步状态。
- 内容:JSON格式文件,包含集群节点的地址、ID等基础信息,仅在集群启动初期生成使用。
二、日志块存储到S3的流程
- 日志采集批量发送:Promtail采集EKS中SpringBoot应用的日志,按标签、时间窗口(默认2小时)打包后发送给Loki的ingester组件。
- 日志块生成:Ingester将接收的日志压缩、编码,生成固定大小(默认1.5GB)的不可变日志块,同时生成对应索引条目。
- 块上传与索引更新:Ingester将日志块上传到S3的
/blocks/<时间戳>/<块ID>/路径下,同时把索引条目写入index目录的索引文件。 - 块持久化完成:日志块上传成功后,被标记为“已完成”,不再接收新日志写入,确保数据一致性。
三、查看S3中日志并转换为可读格式
S3中的日志块是压缩编码的二进制格式,无法直接读取,需通过Loki工具处理:
- 使用
loki-cli导出:
替换查询标签与时间范围,即可导出人类可读的日志文本。loki-cli query '{app="springboot-service"}' --from=2024-01-01T00:00:00Z --to=2024-01-01T01:00:00Z --output=raw > springboot-logs.txt - 通过Loki HTTP API导出:
用curl -G "http://<loki-service>:3100/loki/api/v1/query_range" \ --data-urlencode 'query={app="springboot-service"}' \ --data-urlencode 'start=2024-01-01T00:00:00Z' \ --data-urlencode 'end=2024-01-01T01:00:00Z' \ | jq '.data.result[].values[] | .[1]' > springboot-logs.txtjq提取日志内容,保存为可读文件。
四、通过Loki、Promtail查看S3上的SpringBoot日志
1. Grafana可视化查询(推荐)
- 在Grafana中添加Loki数据源,配置地址为EKS内部的
http://loki:3100。 - 创建日志面板,使用LogQL筛选日志,例如:
支持标签过滤、关键词匹配,实时查看S3上的日志。{app="springboot-service", namespace="default"} |= "ERROR"
2. Loki命令行查询
直接用loki-cli查询历史或实时日志:
# 查询历史日志 loki-cli query '{app="springboot-service"}' --from=2024-01-01T00:00:00Z --to=2024-01-01T01:00:00Z # 实时追踪日志 loki-cli query '{app="springboot-service"}' --live
3. Promtail的角色说明
Promtail仅负责采集、推送日志到Loki,不直接读取S3上的日志。若需重新采集历史日志,可调整Promtail的scrape_configs指向SpringBoot日志文件路径,Promtail会重新读取并推送给Loki,最终存储到S3。
内容的提问来源于stack exchange,提问作者saranyat
相关产品推荐
相关产品推荐

