跳到主要内容

分布式日志轻量级方案

Loki VS ELK

Loki 和 ELK(Elasticsearch, Logstash, Kibana)都是常用的日志处理系统,它们各自具有一些优点。下面是 Loki 相对于 ELK 的几个优点:

  • 存储效率更高:Loki 使用了压缩和切割日志数据的方法来减少存储空间的占用,相比之下,ELK 需要维护一个大的索引,需要更多的存储空间。
  • 查询速度更快:Loki 使用类似 Prometheus 的标签索引机制存储和查询日志数据,这使得它能够快速地进行分布式查询和聚合,而不需要将所有数据都从存储中加载到内存中。而ELK需要将数据从存储中加载到内存中进行查询,查询速度相对较慢。
  • 部署和管理更容易:Loki 是一个轻量级的日志聚合系统,相比之下,ELK 需要部署和管理多个组件,需要更多的资源和人力成本。

通过docker-compose安装Loki、grafana套件

loki进行日志聚合处理 类似elk中的es

grafana是日志显示,类似elk中的kibana,可以通过各种标签和表达式过滤显示日志

docker-compose.yml内容如下

version: "3"

networks:
loki:

services:
loki:
image: grafana/loki
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
ports:
- 3100:3100
networks:
- loki

grafana:
image: grafana/grafana:master
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
ports:
- 3000:3000
networks:
- loki

每台服务端安装loki的docker插件

命令行安装

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

更新插件

docker plugin disable loki --force
docker plugin upgrade loki grafana/loki-docker-driver:latest --grant-all-permissions
docker plugin enable loki
systemctl restart docker

对于loki的docker plugin有两种使用方式。

  • 配置daemon.json,收集此后创建的所有容器的日志(注意,是配置daemon.json后重启docker服务后创建的容器才会把日志输出到loki),如果是已有的容器需要重建容器。
  • 新建容器时指定logging类型为loki,这样只有指定了logging的容器才会输出到loki

编辑daemon.json。linux下默认路径是/etc/docker/daemon.json (需要sudo), windows则默认是%userprofile%.docker\daemon.json ,编辑添加完成后,需要重启docker daemon即可。

{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://YOUR_IP:3100/loki/api/v1/push",
"max-size": "50m",
"max-file": "10"
},
}

Grafana显示和过滤日志

一开始安装的时候将grafana映射到了宿主机的3000端口,所以地址就为 [http://YOUR_IP:3000]

grafana默认用户名密码是admin和admin

第一次进入需要修改admin的密码

左侧菜单configuraiton -> Data Source -> Add Data Source -> loki

在url处配置loki运行地址,保存并测试,同页面点击explore即可查看日志

查询日志

通过搜索语句{compose_service="jeecg-boot-system"} |= "spring",点击run query,可查询jeecg-boot-system服务下,包含“spring”的日志。

LogQL 表达式功能丰富,具体参见:https://grafana.com/docs/loki/latest/logql/log_queries