前言
Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。
现在目前成熟的方案基本上都是:Logstash + Elasticsearch + Kibana
(LEK),但是LEK对资源要求比较高,少了8H8G用起来都是一卡一卡的,所以我们可以转向比较轻量的方案 Promtail + Loki + Grafana
(PLG),本文就介绍PLG这种方案,可以对接各种云存储,比如Minio、S3、COS、OSS等等。
介绍
Grafana Loki
官方:Grafana Loki OSS | Log aggregation system
开源地址:GitHub - grafana/loki: Like Prometheus, but for logs.
Loki 是一个日志聚合系统,旨在存储和查询来自所有应用程序和基础设施的日志。
Grafana
官方:Grafana | Query, visualize, alerting observability platform
开源地址:GitHub - grafana/grafana: The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
一个监控面板,查询、可视化、警报和理解您的数据,无论数据存储在何处。借助 Grafana,您可以通过美观、灵活的仪表板创建、探索和共享所有数据。
Promtail
Promtail 是一个代理,它将本地日志的内容发送到私有 Grafana Loki 。它通常部署到运行需要监视的应用程序的每台计算机。
开始部署
推荐配置2H4G比较丝滑。
参考官方部署手册:Quickstart to run Loki locally | Grafana Loki documentation
官方docker-compose快速部署架构图有下面这些组件:使用的最新版本3.1.x
flog :生成日志行。 flog是常见日志格式的日志生成器。
Grafana Alloy :从 flog 中刮取原木线,并通过网关将它们推送给 Loki。
网关(nginx),接收请求并根据请求的 URL 将它们重定向到适当的容器。
Loki 读取组件:运行查询前端和查询器。
Loki 写入组件:运行分发器和接收器。
Loki 后端组件:运行 Index Gateway、Compactor、Ruler、Bloom Compactor(实验性)和 Bloom Gateway(实验性)。
Minio :Loki 用它来存储索引和块。
Grafana :提供 Loki 中捕获的日志行的可视化。
上面官方采用的是读写分离以及minio存储后端,启动的组件比较多,本人调整了成单节点部署测试,想初步体验的可以使用我下面的 docker-compose.yaml
快速部署。
version: "3"networks:loki:services:
# minio对象存储minio:image: minio/minioentrypoint:- sh- -euc- |mkdir -p /data/loki-data && \mkdir -p /data/loki-ruler && \minio server --console-address ':9001' /dataenvironment:- MINIO_ROOT_USER=lcry- MINIO_ROOT_PASSWORD=www.51it.wang- MINIO_PROMETHEUS_AUTH_TYPE=public- MINIO_UPDATE=offports:- 19000:9000- 19001:9001volumes:- ./minio-data:/datahealthcheck:test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]interval: 15stimeout: 20sretries: 5networks:- loki
# grafana面板grafana:image: grafana:latestenvironment:- GF_SECURITY_ADMIN_PASSWORD=www.51it.wangentrypoint:- sh- -euc- |mkdir -p /etc/grafana/provisioning/datasourcescat <<EOF > /etc/grafana/provisioning/datasources/ds.yamlapiVersion: 1datasources:- name: Lokitype: lokiaccess: proxyurl: http://backend:3100jsonData:httpHeaderName1: "X-Scope-OrgID"secureJsonData:httpHeaderValue1: "tenant-lcry"EOF/run.shports:- "3000:3000"healthcheck:test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" ]interval: 10stimeout: 5sretries: 5networks:- loki# loki后端服务backend:image: grafana/loki:3.1.1depends_on:- miniovolumes:- ./loki-config.yaml:/etc/loki/config.yamlports:- "3100:3100"- "7946"- "9095"command: "-config.file=/etc/loki/config.yaml -target=all"healthcheck:test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3100/ready || exit 1" ]interval: 10stimeout: 5sretries: 5networks:- loki# 采集promtail:image:promtail:3.1.1depends_on:- backendvolumes:- ./log:/var/log- ./promtail-config.yaml:/etc/promtail/config.yamlcommand: -config.file=/etc/promtail/config.yamlnetworks:- loki
loki-config.yaml
配置文件:
auth_enabled: false
server:http_listen_address: 0.0.0.0http_listen_port: 3100memberlist:join_members: ["backend"]dead_node_reclaim_time: 30sgossip_to_dead_nodes_time: 15sleft_ingesters_timeout: 30sbind_addr: ['0.0.0.0']bind_port: 7946gossip_interval: 2sschema_config:configs:- from: 2021-08-01store: tsdbobject_store: s3schema: v13index:prefix: index_period: 24h
common:path_prefix: /lokireplication_factor: 1compactor_address: http://backend:3100storage:s3:endpoint: minio:9000insecure: truebucketnames: loki-dataaccess_key_id: lcrysecret_access_key: www.51it.wangs3forcepathstyle: truering:kvstore:store: memberlist
ruler:storage:s3:bucketnames: loki-rulercompactor:working_directory: /tmp/compactor
promtail-config.yaml
配置文件:
server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://backend:3100/loki/api/v1/pushscrape_configs:- job_name: systemstatic_configs:- targets:- localhostlabels:job: varlogs__path__: /var/log/*log
然后执行命令:docker-compose up -d
运行
随后访问Grafana UI :http://服务器地址:3000/,账号:admin,密码:admin
Loki作为一个活跃的开源项目,持续地接受着来自全球开发者社区的贡献和维护,确保了它能够适应不断变化的云原生环境需求。对于那些寻求高效、经济的日志管理解决方案的开发团队和企业来说,Loki是一个值得深入探索的强大工具。
默认已经在配置文件中加入了loki数据源,直接点击测试是否可用:
直接预览日志,搜索自己手动添加的测试日志,没问题搭建完成。
物理部署protmail
若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。
首先到loki发布版本这里下载对应操作系统的安装包:Releases · grafana/loki · GitHub
新建配置文件promtail-config.yaml
:
server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://服务端IP:3100/loki/api/v1/pushscrape_configs:- job_name: service-logstatic_configs:- targets:- xxx.xxx.xxx.xxxlabels:job: varlogs__path__: /var/log/*log
编写启停脚本:ubuntu为例
start.sh
:
#!/bin/bash
nohup ./promtail-linux-amd64 -config.file=./promtail-config.yaml > ./server.log 2>&1 &
echo "$!" > pid
stop.sh
:
#!/bin/bash
kill -9 `cat pid`
echo "关闭成功!"
执行启动 ./start.sh
查看日志 tail -300f server.log
,无报错,观察Grafana UI日志已经能看到了则成功
更多protmail配置可参考链接:Promtail agent | Grafana Loki documentation
资源占用
最后我们来看下轻量级的Promtail + Loki + Grafana + Minio
整个容器占用的内存大小。
总共加起来300MB不到,相当的丝滑,若你只是需要收集一些自己折腾玩的服务日志太合适不过了。
总结
本文通过对比不同的日志平台,最终实战搭建了Promtail + Loki + Grafana + Minio
,实打实的可以用于生产,但是要注意生产环境的HA部署以及参考官方文档进行优化,比如不同租户的请求速度频率的限制大小,日志的保留时长,最大上传的日志大小等等配置,希望本文对大家有所帮助。