前言
在微服务以及云原生时代,由于应用部署到遍地是,为了不像传统的方式上每台应用服务器筛选日志,那么我们可以使用日志管理平台,将所有日志都采集到统一的平台,供运维和研发人员快速排查故障,进而提升效率。
这样的日志平台云厂商有提供,比如腾讯云的日志服务CLS,阿里云日志SLS,百度云日志服务BLS,天翼云日志服务CT-LTS,谷歌云Cloud Logging等等。
若你是大中型公司那么肯定运维把这些都做好了,也不用考虑任何成本问题,但是在金融等风险行业,云产品基本是零信任,因为日志中可能打了敏感等身份,要用那也必须要自建。
现在目前成熟的方案基本上都是:Logstash Elasticsearch Kibana
(LEK),但是LEK对资源要求比较高,少了8H8G用起来都是一卡一卡的,所以我们可以转向比较轻量的方案 Promtail Loki Grafana
(PLG),本文就介绍PLG这种方案,可以对接各种云存储,比如Minio、S3、COS、OSS等等。
介绍
Grafana Loki
官方:https://grafana.com/oss/loki/
开源地址:https://github.com/grafana/loki
Loki 是一个日志聚合系统,旨在存储和查询来自所有应用程序和基础设施的日志。
Grafana
官方:https://grafana.com/grafana/
开源地址:https://github.com/grafana/grafana
一个监控面板,查询、可视化、警报和理解您的数据,无论数据存储在何处。借助 Grafana,您可以通过美观、灵活的仪表板创建、探索和共享所有数据。
Promtail
Promtail 是一个代理,它将本地日志的内容发送到私有 Grafana Loki 。它通常部署到运行需要监视的应用程序的每台计算机。
开始部署
推荐配置2H4G比较丝滑。
参考官方部署手册:https://grafana.com/docs/loki/latest/get-started/quick-start/
官方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/minio
entrypoint:
- sh
- -euc
- |
mkdir -p /data/loki-data &&
mkdir -p /data/loki-ruler &&
minio server --console-address ':9001' /data
environment:
- MINIO_ROOT_USER=lcry
- MINIO_ROOT_PASSWORD=www.51it.wang
- MINIO_PROMETHEUS_AUTH_TYPE=public
- MINIO_UPDATE=off
ports:
- 19000:9000
- 19001:9001
volumes:
- ./minio-data:/data
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]
interval: 15s
timeout: 20s
retries: 5
networks:
- loki
# grafana面板
grafana:
image: grafana:latest
environment:
- GF_SECURITY_ADMIN_PASSWORD=www.51it.wang
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://backend:3100
jsonData:
httpHeaderName1: "X-Scope-OrgID"
secureJsonData:
httpHeaderValue1: "tenant-lcry"
EOF
/run.sh
ports:
- "3000:3000"
healthcheck:
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" ]
interval: 10s
timeout: 5s
retries: 5
networks:
- loki
# loki后端服务
backend:
image: grafana/loki:3.1.1
depends_on:
- minio
volumes:
- ./loki-config.yaml:/etc/loki/config.yaml
ports:
- "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: 10s
timeout: 5s
retries: 5
networks:
- loki
# 采集
promtail:
image:promtail:3.1.1
depends_on:
- backend
volumes:
- ./log:/var/log
- ./promtail-config.yaml:/etc/promtail/config.yaml
command: -config.file=/etc/promtail/config.yaml
networks:
- loki
loki-config.yaml
配置文件:
auth_enabled: false
server:
http_listen_address: 0.0.0.0
http_listen_port: 3100
memberlist:
join_members: ["backend"]
dead_node_reclaim_time: 30s
gossip_to_dead_nodes_time: 15s
left_ingesters_timeout: 30s
bind_addr: ['0.0.0.0']
bind_port: 7946
gossip_interval: 2s
schema_config:
configs:
- from: 2021-08-01
store: tsdb
object_store: s3
schema: v13
index:
prefix: index_
period: 24h
common:
path_prefix: /loki
replication_factor: 1
compactor_address: http://backend:3100
storage:
s3:
endpoint: minio:9000
insecure: true
bucketnames: loki-data
access_key_id: lcry
secret_access_key: www.51it.wang
s3forcepathstyle: true
ring:
kvstore:
store: memberlist
ruler:
storage:
s3:
bucketnames: loki-ruler
compactor:
working_directory: /tmp/compactor
promtail-config.yaml
配置文件:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://backend:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log
然后执行命令:docker-compose up -d
运行
随后访问Grafana UI :http://服务器地址:3000/,账号:admin,密码:www.51it.wang
默认已经在配置文件中加入了loki数据源,直接点击测试是否可用:
直接预览日志,搜索自己手动添加的测试日志,没问题搭建完成。
物理部署protmail
若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。
首先到loki发布版本这里下载对应操作系统的安装包:https://github.com/grafana/loki/releases
新建配置文件promtail-config.yaml
:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://服务端IP:3100/loki/api/v1/push
scrape_configs:
- job_name: service-log
static_configs:
- targets:
- xxx.xxx.xxx.xxx
labels:
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配置可参考链接:https://grafana.com/docs/loki/latest/send-data/promtail/
资源占用
最后我们来看下轻量级的Promtail Loki Grafana Minio
整个容器占用的内存大小。
总共加起来300MB不到,相当的丝滑,若你只是需要收集一些自己折腾玩的服务日志太合适不过了。
总结
本文通过对比不同的日志平台,最终实战搭建了Promtail Loki Grafana Minio
,实打实的可以用于生产,但是要注意生产环境的HA部署以及参考官方文档进行优化,比如不同租户的请求速度频率的限制大小,日志的保留时长,最大上传的日志大小等等配置,希望本文对大家有所帮助。
参考链接
Promtail Loki Grafana搭建轻量级日志管理平台 Request Validation and Rate-Limit Errors 日志监控系统 loki 配置文件详解 Loki、promtail、Grafana、Prometheus日志监控安装与配置 Loki被限流了,Limits_Config到底限了个啥? 将日志转发到 Loki grafana loki答疑 loki查询超时配置优化 Promtail agent官方文档 轻量级日志收集系统 Grafana Loki 初上手 failed to get token ranges for ingester err="zone not set"