Grafana Loki` 是一套功能齐全的日志堆栈组件,与其他日志记录系统不同,Loki 是基于仅索引有关日志元数据的想法而构建的:标签(就像 Prometheus 标签一样)。日志数据本身被压缩然后并存储在对象存储(例如 S3 或 GCS)的块中,甚至存储在本地文件系统上,轻量级的索引和高度压缩的块简化了操作,并显著降低了 Loki 的成本,Loki 更适合中小团队。由于 Loki 使用和 Prometheus 类似的标签概念,所以如果你熟悉 Prometheus 那么将很容易上手,也可以直接和 Grafana 集成,只需要添加 Loki 数据源就可以开始查询日志数据了。
Loki 还提供了一个专门用于日志查询的 LogQL
查询语句,类似于 PromQL
,通过 LogQL 我们可以很容易查询到需要的日志,也可以很轻松获取监控指标。Loki 还能够将 LogQL 查询直接转换为 Prometheus 指标。此外 Loki 允许我们定义有关 LogQL 指标的报警,并可以将它们和 Alertmanager 进行对接。
Grafana Loki 主要由 3 部分组成:
loki
: 日志记录引擎,负责存储日志和处理查询promtail
: 代理,负责收集日志并将其发送给 lokigrafana
: UI 界面
Grafana Loki 组件
Grafana 包含很多组件,promtail, distributor, ingester, querier, ruler, query frontend, Grafana,让我们看一下这些组件。
**Promtail (采集器)**普runte尔
Promtail 是充当 Loki 的日志代理(agent)的重要组件。它的功能是从系统中收集每个日志,标记它,然后将其发送给 Loki。Loki 从本地日志文件和系统日志中收集日志。
您必须在要收集日志的每个系统中安装 Promtail,同样,如果您在 Kubernetes 上使用 Loki,则必须在每个节点中部署 Promtail 作为守护进程集(Daemonset)。
Distributor (分发器)
Distributor 是一个无状态组件,负责处理和验证从日志代理(如 Promtail)接收的日志,并将日志分发到 ingester。
当 Distributor 收到日志时,它首先验证日志是否符合配置,例如有效标签、不是较旧的时间戳以及日志是否太长。
验证完成后,Distributor 会根据一致性哈希将日志分发到每个 ingester,以确保平均分配给每个可用的 ingester。
Ingester (接收器)
Ingester 负责在其文件系统上存储和索引从 Distributor 收到的日志,并定期将日志传输到持久性存储(长期存储),如 S3。
Ingester 根据配置设置保留策略(自动日志删除时间)。
它使用时间序列数据库以一定的结构格式存储日志,这简化了高效查询和日志过期的过程。
Ruler (规则器)
Ruler 是 Loki 的监控和告警组件,其作用是记录指标并根据收到的日志数据触发告警。它不是直接衡量指标,而是将日志数据转换为指标。
Ruler 监控日志并在检测到任何问题时发出通知,并通过电子邮件或 Slack 发送通知。
**Querier (查询器)**que瑞
顾名思义,Querier 负责使用 LogQL 查询语言从存储和 ingester 中查询日志。它根据用户查询(如时间戳、标签等)过滤和聚合日志。
查询器缓存之前的查询,以防止一次又一次地查询相同的日志,它只查询一次具有相同时间戳、标签和日志消息的日志。
Query Frontend (查询前端)
Query Frontend 是一个与用户交互的无状态组件,它负责处理查询请求、执行查询以及通过 Grafana 仪表板可视化日志。
Query Frontend 将大型查询拆分为多个较小的查询,并同时运行所有查询,这可以防止大型查询在单个查询中导致内存问题,并有助于加快执行速度。
Grafana (前端展示)
Grafana 是一个开源工具,可帮助查询、可视化和监控日志。我们可以将 Loki 与 Grafana 集成,并在仪表板、图表等方式可视化日志数据。
Grafana 使用查询语言 LogQL 与 Grafana 集成,我们也可以在 Grafana 中编写 LogQL 查询来过滤和查询日志。
Log Storage (后端存储)
Loki 存储日志数据,提高查询和接收日志的效率。将日志数据压缩成块,根据时间进行组织,并为其提供标签和时间戳。然后,它以键值对格式为每个块创建一个索引,包含块时间戳和标签等。
例如,将块的索引视为一本书的索引。
Chunks 和 Index 可以存储在各种后端对象存储或文件系统中。
一旦存储了块,它就会为数据创建一个保留期,并根据保留期自动删除。
如果使用文件系统作为存储,则块和索引的默认存储路径是 /var/lib/loki/chunks
和 /var/lib/loki/index
。
Loki 安装
二进制安装
下载 安装包
wget https://github.com/grafana/loki/releases/download/v3.3.1/loki-linux-amd64.zip
wget https://github.com/grafana/loki/releases/download/v3.3.1/promtail-linux-amd64.zip
下载配置文件
wget https://raw.githubusercontent.com/grafana/loki/v3.3.1/cmd/loki/loki-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v3.3.1/clients/cmd/promtail/promtail-local-config.yaml
Loki 配置文件
# This is a complete configuration to deploy Loki backed by the filesystem.
# The index will be shipped to the storage via tsdb-shipper.
auth_enabled: false
server:
http_listen_port: 3100
common:
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
replication_factor: 1
path_prefix: /tmp/loki
schema_config:
configs:
- from: 2020-05-15
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
storage_config:
filesystem:
directory: /tmp/loki/chunks
Promtail 配置文件
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.11.10:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log
- job_name: els-log
static_configs:
- targets:
- localhost
labels:
job: els-log
__path__: /var/log/elasticsearch/*.json
启动
# 启动 loki
./loki -config.file=loki-config.yaml
# 启动 promtail
./promtail -config.file=promtail-local-config.yaml
Helm 安装
# helm repo add grafana https://grafana.github.io/helm-charts
# helm repo update
#在所有节点上都导入loki grafana promtail镜像在进行helm安装
# helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true --set grafana.service.type=NodePort --create-namespace --namespace loki
#看启动了没 kubectl get pods -n loki
# 获取 grafana 用户密码
# kubectl -n loki get secrets loki-grafana -o jsonpath="{.data.admin-password}" | base64 -d
日志查询
Loki是参考Prometheus设计的,所以查询语法和PromQL类似,比如查询命名空间为kube-system下的所有Pod的日志,只需要在Log browser中输入=={namespace=“kube-system”},==然后单击Run query
即可
查看命名空间为kube-system且Pod名称包含calico的日志:
{namespace="kube-system",pod=~"calico.*"}
- =~:正则模糊匹配。
- =:完全匹配。
- !=:不等于。
- !~:正则模糊不等于。
Loki语法同时支持Pipeline,比如需要过滤日志包含avg字段的日志:
{namespace="kube-system",pod=~"calico.*"} |~ "avg"
可以使用logfmt对日志进行格式化,然后进行值的判断,比如找到包含avg字段并且longest的值大于10ms的日志:
{namespace="kube-system",pod=~"calico.*"} |~ "avg" |logfmt | longest > 10ms
Ref:
Loki 安装: https://grafana.com/docs/loki/v3.3.x/setup/install/local/
Promtail 安装: https://grafana.com/docs/loki/v3.3.x/send-data/promtail/
日志轮转: https://grafana.com/docs/loki/latest/operations/storage/retention/
Promtail 配置文件: https://grafana.com/docs/loki/latest/send-data/promtail/configuration/#global