一、简 介
Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。系统架构十分简单,由以下3个部分组成 :
* Loki 是主服务器,负责存储日志和处理查询 。
* promtail 是代理,负责收集日志并将其发送给 loki(只收集日志,不在本地进行运算) 。
* Grafana 用于 UI 展示。
只要在被监控服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不关只有查询分析日志的能力,还能对日志进行监控和报警
二、系 统 架 构
1、promtail收集并将日志发送给loki的 Distributor 组件
2、Distributor会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到Ingester(存储)
3、Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端
4、Querier(查询器) 收到HTTP查询请求,并将请求发送至Ingester 用以获取内存数据 ,Ingester 收到请求后返回符合条件的数据 ;
5、如果 Ingester 没有返回数据,Querier 会从后端存储加载数据并遍历去重执行查询 ,通过HTTP返回查询结果
三、与 ELK 比 较
1、ELK虽然功能丰富,但规模复杂,资源占用高,操作苦难,很多功能往往用不上,有点杀鸡用牛刀的感觉。
2、不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
3、通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
4、安装部署简单快速,且受 Grafana 原生支持。
四、LOKI查询类型
1、日志查询返回日志行的内容。
例如:对关键字的统计(五分钟出现WARN次数)
2、度量查询扩展了日志查询,并根据来自日志查询的日志内容计算样本值。
例如:对数据的清洗:五分钟内数据的最小值
五、LOKI架构部署
1、部署环境
服务器 |
系统 |
部署软件 |
版本号 |
默认端口 |
被监控服务器 |
Linux |
Promtail |
v2.2.1 |
9080 |
LOKI服务器 |
Linux |
Loki |
v2.2.1 |
3100 |
2、部署过程
2.1 在应用服务器上部署promtail
curl -O -L "https://github.com/grafana/loki/releases/download/v2.2.1/promtail-linux-amd64.zip"
unzip -q promtail-linux-amd64.zip -d /opt/jzjk/promtail
并新增文件/opt/jzjk/promtail/promtail.yaml
cat /opt/jzjk/promtail/promtail.yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki服务器IP:3100/loki/api/v1/push
scrape_configs:
- job_name: test_log
static_configs:
- targets:
- localhost
labels:
job: test_log
__path__: /opt/test.log
2.2 在LOKI服务器上部署loki
curl -O -L "https://github.com/grafana/loki/releases/download/v2.2.1/loki-linux-amd64.zip"
unzip -q loki-linux-amd64.zip -d /opt/jzjk/loki
并新增文件/opt/jzjk/loki/loki.yaml
auth_enabled: false
server:
http_listen_port: 3100 #端口号
log_level: debug #日志等级为debug
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
schema_config:
configs:
- from: 2020-05-15
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 168h #每张表的时间范围6天
storage_config:
boltdb:
directory: /opt/jzjk/loki/index #索引文件存储地址
filesystem:
directory: /opt/jzjk/loki/chunks #块存储地址
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
3.启动服务(先启动LOKI)
nohup /opt/jzjk/loki/loki-linux-amd64 -config.file=/opt/jzjk/loki/loki.yaml &
nohup /opt/jzjk/promtail/promtail-linux-amd64 -config.file=/opt/jzjk/promtail/promtail.yaml &
六、LOKI数据的展示
1.非json格式日志的数据处理
在loki中查看日志全量,发现Log labels 只有2个,假设java后面的数据是我们要获取的变量,仅用现在的Log labels 无法获取,故需要用正则表达式regexp新增我们要获取的数据
通过公式计算新增Log labels名称为“value”
获取纯数据,用图标用于展示(五分钟内最小值)
七、LOKI告警配置
1.在loki配置文件中新增ruler组件,新增内容如下:
ruler:
storage:
type: local
local:
#rule规则存储目录
directory: /tmp/rules
rule_path: /tmp/scratch
#告警推送地址,对接到prometheus告警地址
alertmanager_url: http://localhost:9093
ring:
kvstore:
store: inmemory
enable_api: true
2、确保/tmp/rules及/tmp/scratch目录存在,并在/tmp/rules下新建目录fake(为何是fake,请看下图org_id部分),在fake下创建yaml文件存放告警规则
cat /tmp/rules/fake/aler.yaml
groups:
- name: example
rules:
- alert: test_log_line number
# 日志最近五天的行数大于0就告警
expr: count_over_time({job="test_log"} [5d]) >0
for: 1m
3、重启loki进程,打开prometheus的告警页面 prometheus_ip:9093验证告警是否呈现