grafana loki轻量级日志收集系统
# 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
$ docker run -ti -p 3000:3000 grafana/grafana:master
$ docker run -ti -p --name loki 3100:3100 grafana/loki:2.4.1
1
2
2
启动 promtail ,将 promtail 配置文件拷贝到宿主机
$ 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
1
2
3
2
3
docker-compose启动
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.5.0
ports:
- 3100:3100
volumes:
- ./config/loki/local-config.yaml:/etc/loki/local-config.yaml
- /etc/localtime:/etc/localtime
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.5.0
volumes:
- ./config/promtail/config.yml:/etc/promtail/config.yml
- /var/log:/var/log
- /etc/localtime:/etc/localtime
command: -config.file=/etc/promtail/config.yml
networks:
- loki
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
收集 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 # 收集日志路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
挂载 nginx 日志文件目录和 promtail 配置文件到容器
$ 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
1
2
3
4
2
3
4
# 使用 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"}
1
匹配运算符
= 等于
*!= 不相等
=~ 正则表达式匹配
!~ 不匹配正则表达式 Loki 过滤器 搜索表达式
搜索表达式可以只是文本或正则表达式
表达式接受RE2语法
匹配项区分大小写 过滤器类型
|= 行包含字符串。
!= 行不包含字符串。
|~ 行匹配正则表达式。
!~ 行与正则表达式不匹配
{filename="/var/log/nginx/pcb.access.log",job="nginxlogs"} |~ "\"nx_status\":200"
1
# 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
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 注意事项
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\"},"
1
增加 Loki 限制
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
1
2
3
4
5
6
2
3
4
5
6
上次更新: 2023/06/09, 19:14:23