loki介绍
Loki是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。
- 不对日志进行全文索引。Loki中存储的是压缩后的非结构化日志,并且只对元数据建立索引,因此Loki 具有操作简单、低成本的优势。
- 使用与 Prometheus 相同的标签。Loki通过标签对日志进行索引和分组,这使得日志的扩展和操作效率更高。
- 特别适合储存 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会被自动删除和编入索引。
- Grafana 原生支持。
架构
Loki 日志系统由以下3个部分组成:
- loki是主服务器,负责存储日志和处理查询。
- promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。
- Grafana用于 UI展示。
Loki 日志系统由以下3个部分组成: - loki是主服务器,负责存储日志和处理查询。
- promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。
- Grafana用于 UI展示。
https://www.yuque.com/yuqueyonghukvyedl/eh0xog/tgdz0i
部署loki
wget https://raw.githubusercontent.com/grafana/loki/v2.3.0/cmd/loki/loki-local-config.yaml -O loki-config.yaml
docker run -d -v $(pwd):/mnt/config -p 3100:3100 grafana/loki:latest -config.file=/mnt/config/loki-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/v2.3.0/clients/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml
docker run -d -v $(pwd):/mnt/config -v /var/log:/var/log grafana/promtail:latest -config.file=/mnt/config/promtail-config.yaml
docker pull grafana/grafana
docker run -d -p 3000:3000 --name=grafana grafana/grafana
访问地址
http://10.6.8.227:3100/metrics
http://10.6.8.227:3000
默认账号和密码: admin
LogQL 查询语句
Log Query Language(日志查询语言,简称LogQL) 受 PromQL 启发,可以看作是分布式的 grep 命令,用来从汇总的日志源筛选日志。LogQL 通过 labels(标签) 和 operators(运算符) 进行过滤。
LogQL 查询有两种类型:
- Log Queries(日志查询) # 根据查询语句返回日志条目,每行是一条日志。
a. 基本的日志查询由两部分组成
ⅰ. log stream selector # 日志流选择器
ⅱ. filter expression # 过滤表达式 - Metric Queries(指标查询) # 用于扩展日志查询并根据 Log Queries 中的日志计数计算值。通过这种查询语句,可以计算将日志数据量化成指标信息,并且,Promtail 可以通过这种查询语句将指标信息,填充到自己暴露的 Metrics 端点中。
注意:由于 Loki 的设计,所有 LogQL 查询都必须包含一个日志流选择器
日志流选择器确定将搜索多少日志流(日志内容的唯一来源,例如文件)。然后,更细粒度的日志流选择器将搜索到的流的数量减少到可管理的数量。这意味着传递给日志流选择器的标签将影响查询执行的相对性能。然后使用过滤器表达式对来自匹配日志流的聚合日志进行分布式grep。
Log Queries(日志查询)
基本的日志查询由两部分组成:
● Log Stream Selector(日志流选择器)
● Log Pipeline(日志管道)
注意:由于 Loki 的设计原则,所有的 LogQL 查询必须包含 Log Stream Selector(日志流选择器)
日志流选择器决定了有多少日志流将被搜索到,一个更细粒度的日志流选择器将搜索到流的数量减少到一个可管理的数量。所以传递给日志流选择器的标签将影响查询执行的性能。
而日志流选择器后面的日志管道是可选的,日志管道是一组阶段表达式,它们被串联在一起应用于所过滤的日志流,每个表达式都可以过滤、解析和改变日志行内容以及各自的标签。
1. |= # 匹配包含指定字符串的日志行
2. != # 匹配不包含指定字符串的日志行
3. |~ # 匹配包含正则表达式的日志行
4. !~ # 匹配不包含正则表达式的日志行
{job="varlogs"} |="ERROR" !="level" |="2021-08-23"
参考文献
https://grafana.com/docs/loki/latest/logql/ip/