# Loki 日志系统
# Loki 概述
Grafana Loki
- Loki的第一个稳定版本于2019年11月19日发布
- 是 Grafana Labs 团队最新的开源项目
- 是一个水平可扩展,高可用性,多租户的日志聚合系统
Loki的第一个稳定版本于2019年11月19日发布 是 Grafana Labs 团队最新的开源项目 是一个水平可扩展,高可用性,多租户的日志聚合系统 Loki 特性
- 不对日志进行全文索引(vs ELK技)
- 通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本
- 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,使得日志的扩展和操作效率更高
- 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引
- 适合中小团队对日志平台的需求
- 受 Grafana 原生支持
Loki 组成
loki
是主服务器,负责存储日志和处理查询promtail
是代理,负责收集日志并将其发送给 lokiGrafana
用于 UI 展示
# 安装 Loki
# 环境说明
演示环境拓扑
- Loki和grafana服务器:192.168.0.11
- promtail 日志收集服务器:192.168.0.11,192.168.0.12
- 使用docker下载并运行镜像
# Loki 主服务器
运行 grafana loki
代码语言:javascript复制$ docker run -ti -p 3000:3000 grafana/grafana:master
$ docker run -ti -p --name loki 3100:3100 grafana/loki:2.4.1
启动 promtail ,将 promtail 配置文件拷贝到宿主机
代码语言:javascript复制$ docker run -ti --name promtail grafana/promtail:2.4.1 -config.file=/etc/promtail/config.yml
$ mkdir /data/soft/promtail
$ docker cp promtail:/etc/promtail/config.yml /data/soft/promtail/config.yml
收集 nginx 日志
- 修改 promtail 配置文件
- url: 指定 Loki 地址
$ vim /data/soft/promtail/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.0.11:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: nginxlogs # job 名称
__path__: /var/log/nginx/*log # 收集日志路径
挂载 nginx 日志文件目录和 promtail 配置文件到容器
代码语言:javascript复制$ docker run -ti --name promtail
-v /var/log/nginx/:/var/log/nginx/
-v /data/soft/promtail/config.yml:/etc/promtail/config.yml
grafana/promtail:2.4.1 -config.file=/etc/promtail/config.yml
# 使用 Loki
访问 grafana 面板
- 默认用户名和密码是 admin
http://192.168.0.11:3000
添加数据源
- 配置选择 DATA SOURCES
- 点击 Add data source 添加 Loki
配置 Loki 地址
- url 填写正确地址
- 点击 Save & test 测试并保存
使用 Loki
- 切换到 grafana 左侧区域的
Explore
- 数据库源选择 Loki
- 点击 Log browser 选择需要查看的日志
# 查看日志
# Loki 选择器
查询表达式
- 对于查询表达式的标签部分,将其包装在花括号中{}
- 使用键值对的语法来选择标签
- 多个标签表达式用逗号分隔
{filename="/var/log/nginx/pcb.access.log",job="nginxlogs"}
匹配运算符
- = 等于
- *!= 不相等
- =~ 正则表达式匹配
- !~ 不匹配正则表达式 Loki 过滤器 搜索表达式
- 搜索表达式可以只是文本或正则表达式
- 表达式接受RE2语法
- 匹配项区分大小写 过滤器类型
- |= 行包含字符串。
- != 行不包含字符串。
- |~ 行匹配正则表达式。
- !~ 行与正则表达式不匹配
{filename="/var/log/nginx/pcb.access.log",job="nginxlogs"} |~ ""nx_status":200"
# promtail
# 客户端收集日志
将需要收集的日志挂载到 promtail 容器
- 客户端仅启动 promtail 日志收集容器
- -v 宿主机日志目录:/var/log/****
promtail 配置说明
- 支持通配符 *, 表示所有,比如 *.log
- 多个日志目录可以使用 {path1,path2,…pathN} 区分
- 不同的 job 使用 targets 区分
- targets:
- localhost
labels:
job: logsname1
__path__: /var/log/path1/*log
- targets:
- localhost
labels:
job: logsname2
__path__: /var/log/path2/*log
# 注意事项
promtail 报 429 错误
- 收集的日志太多了,超过了 loki 的限制
level=warn ts=2021-12-02T06:27:01.372586524Z caller=client.go:349 component=client host=192.168.0.11:3100 msg="error sending batch, will retry" status=429 error="server returned HTTP status 429 Too Many Requests (429): entry with timestamp 2021-12-02 06:27:01.316127865 0000 UTC ignored, reason: 'Per stream rate limit exceeded (limit: 3MB/sec) while attempting to ingest for stream '{filename="/var/log/nginx/nginx.log", job="nginxlogs"}' totaling 1697740B, consider splitting a stream via additional labels or contact your Loki administrator to see if the limt can be increased' for stream: {filename="/var/log/nginx/nginx.log", job="nginxlogs"},"
增加 Loki 限制
代码语言:javascript复制limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
ingestion_rate_mb: 40
ingestion_burst_size_mb: 20