vlambda博客
学习文章列表

如何快速打造"小而美"的日志系统?试试轻量化日志服务 Loki!

背景

日志系统协助我们解决线上或者线下问题,传统的日志往往采用笨重的ELKStack,它虽然功能强大,但需要的资源和入门门槛也比较高,我们往往只需要很小的一部分功能。常见的线上问题解决步骤一般如下:

  1. 收到报警信息或者邮件

  2. 到大屏观察统计信息(grafana)

  3. 日志系统查看报错日志(ELKStack或者基于ELKStack上开发)

  4. 定位错误原因到具体的服务或者主机

  5. 解决问题

从上面的步骤看,步骤2,步骤3要经过一次切换,从大屏切换到日志平台。而定位错误原因我们往往只关注具体哪个服务或者主机报错,报了什么错误,其它的并不是很关注。这种情况下ELKStack就有点杀鸡用牛刀的感觉了!

另外,ELKStack规模复杂,资源占用高,操作苦难,不适合敏捷开发的快速迭代。

loki的第一目的就是最小化度量和日志的切换成本,有助于减少异常事件的响应时间和提高用户的体验。

Loki 日志方案

整体上 Loki 采用了读写分离的架构,由多个模块组成。

* Promtail、Fluent-bit、Fluentd、Rsyslog 等开源客户端负责采集并上报日志;

* Distributor:日志写入入口,将数据转发到 Ingester;

* Ingester:日志的写入服务,缓存并写入日志内容和索引到底层存储;

* Querier:日志读取服务,执行搜索请求;

* QueryFrontend:日志读取入口,分发读取请求到 Querier 并返回结果;

* Cassandra/BigTable/DnyamoDB/S3/GCS:索引、日志内容底层存储;

* Cache:缓存,支持 Redis/Memcache/本地 Cache。

咋一看,上面的结构也很复杂,而我们的最终目的是打造一个“小而美”的日志方案,太复杂的事情留待以后扩展吧!

”小而美“日志方案:Loki/Promtail/Grafana

Loki Stack 包含三个组件:

  • Loki: 相当于 EFK 中的 ElasticSearch,用于存储和查询日志

  • Promtail: 相当于 EFK 中的 Filebeat/Fluentd,用于采集和发送日志

  • Grafana: 相当于 EFK 中的 Kibana,用于 UI 展示

看着好像还是很复杂,其实非常简单啦,我们来感受一下吧!

Loki/Promtail/Grafana实战

Loki安装搭建

loki下载

$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.2.1/loki-linux-amd64.zip"
# extract the binary
$ unzip "loki-linux-amd64.zip"
# make sure it is executable
$ chmod a+x "loki-linux-amd64"
$ mkdir ${loki_root}/data

loki配置文件loki-local-config.yaml

auth_enabled: false

server:
http_listen_port: 3100

ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
max_transfer_retries: 0

schema_config:
configs:
- from: 2021-05-08
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 168h

storage_config:
boltdb:
directory: /www/loki/data/index

filesystem:
directory: /www/loki/data/chunks

limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h

chunk_store_config:
max_look_back_period: 0s

table_manager:
retention_deletes_enabled: false
retention_period: 0s

启动

#启动Loki命令 
nohup ./loki-linux-amd64 -config.file=loki-local-config.yaml > loki.log 2>&1 &
#查看启动是否成功(查看3100端口的进程是否存在)
netstat -tunlp | grep 3100
#或者根据名称查找进程(执行命令后有下边的显示,则启动成功)
ps -ef | grep loki-linux-amd64

Promtail安装搭建

下载

$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.2.1/promtail-linux-amd64.zip"
# extract the binary
$ unzip "promtail-linux-amd64.zip"
# make sure it is executable
$ chmod a+x "promtail-linux-amd64"

配置文件promtail-local-config.yaml

server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: /www/promtail/positions.yaml

clients:
- url: http://${ip}:3100/loki/api/v1/push

scrape_configs:
- job_name: nacos
static_configs:
- targets:
- ${ip}
labels:
job: xxxlog
__path__: ${directory}/logs/nacos.log

启动

#Promtail默认端口是9080,启动完成后,可以采用上边的方式查看进程是否启动成功 
nohup ./promtail-linux-amd64 -config.file=promtail-local-config.yaml > promtail.log 2>&1 &

查看Promtail数据采集web页面

浏览器访问:http://${host}:9080/targets


Grafana安装搭建

#下载Grafana
https://grafana.com/grafana/download
#解压Grafana
tar -vxf grafana-VERSION.linux-amd64.tar.gz
#启动Grafana
nohup ./bin/grafana-server >> grafana.log 2>&1 &

验证grafana

浏览器访问http://${host}:3000/ 默认用户名密码 admin/admin

Grafana配置lork数据源


Grafana日志展示


总结

Loki 作为一个新兴的日志解决方案,现在越来越受到关注。Loki 作为一个正在快速发展的项目,最新版本已到 2.0,相较 1.6 增强了诸如日志解析、Ruler、Boltdb-shipper 等新功能,不过基本的模块、架构、数据模型、工作原理上已处于稳定状态。