暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

轻量级日志系统 Loki入门

程序员恰恰 2024-06-14
263


  • 一、Loki 简介

  • 二、Loki 架构

  • 三、安装使用教程


一、Loki 简介
Loki 的第一个稳定版本于 2019 年 11 月 19 日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。Loki 是专门用于聚集日志数据,重点是高可用性和可伸缩性。与竞争对手不同的是,它确实易于安装且资源效率极高。
项目地址https://github.com/grafana/loki/

与其他日志聚合系统相比,Loki 具有下面的一些特性:
  • 不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。

  • 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高,能对接 alertmanager。

  • 特别适合储存 Kubernetes Pod 日志;诸如 Pod 标签之类的元数据会被自动删除和编入索引。

  • 受 Grafana 原生支持,避免 kibana 和 grafana 来回切换。

我们来简单总结一下 Loki 的优缺点。
优点 :
  • Loki 的架构非常简单,使用了和 Prometheus 一样的标签来作为索引,通过这些标签既可以查询日志的内容也可以查询到监控的数据,不但减少了两种查询之间的切换成本,也极大地降低了日志索引的存储。

  • 与 ELK 相比,消耗的成本更低,具有成本效益。

  • 在日志的收集以及可视化上可以连用 Grafana,实现在日志上的筛选以及查看上下行的功能。

缺点 :
  • 技术比较新颖,相对应的论坛不是非常活跃。

  • 功能单一,只针对日志的查看,筛选有好的表现,对于数据的处理以及清洗没有 ELK 强大,同时与 ELK 相比,对于后期,ELK 可以连用各种技术进行日志的大数据处理,但是 loki 不行。

二、Loki 架构

Loki 的架构如下:
不难看出,Loki 的架构非常简单,使用了和 Prometheus 一样的标签来作为索引,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据,不但减少了两种查询之间的切换成本,也极大地降低了日志索引的存储。Loki 将使用与 Prometheus 相同的服务发现和标签重新标记库,编写了 pormtail,在 Kubernetes 中 promtail 以 DaemonSet 方式运行在每个节点中,通过 Kubernetes API 等到日志的正确元数据,并将它们发送到 Loki。下面是日志的存储架构:

Loki 组成部分

  • Loki 是主服务器,负责存储日志和处理查询。

  • Promtail 是代理,负责收集日志并将其发送给 Loki 。

  • Grafana 用于 UI 展示。

三、Loki安装

本次安装使用 Docker 部署

3.1、下载 yaml 文件

wget https://raw.githubusercontent.com/grafana/loki/v2.2.0/production/docker-compose.yaml -O docker-compose.yaml

复制

  下载完成如下:

version: "3"

networks:
loki:
services:
loki:
image: grafana/loki:2.0.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.0.0
volumes:
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
networks:
- loki

复制

3.2、启动服务

因为我之前安装过grafana,因此我删除了docker-compose.yml中的grafana,只安装了loki和promtail。

3.3、配置服务

浏览器访问ip:3000,账密默认为:admin/admin
复制

  • 五、整合SpringBoot

3.4、 配置数据源

配置 ip 和默认数据源,配置完成点击测试/保存

3.5、 配置数据源

explore 查询样例:查询将从名为"varlogs"的作业中筛选出包含"error"字符串的日志条目。


得到了日志里所有包含error的日志


至此一次样例日志查询完成

3.6、promtail 配置详解

promtail 容器为日志采集容器,配置文件在 promtail 容器/etc/promtail/config.yml,将该容器部署在需要采集日志的服务器上就能正常采集日志传回 loki 服务收集整理

root@2a0cc144dd58:/#  cat  /etc/promtail/config.yml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push     #这里配置的地址为loki服务器日志收集的信息

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs                       #这里为刚才选择job下子标签
      __path__: /var/log/*log            #将采集的日志放在/var/log/*log下自动发现

复制

3.7、尝试增加一台日志采集服务器(在其他服务器

我们需要再部署一个promtail来采集日志,并将日志推送给loki

3.7.1、编写 promtail 的配置文件 config.yml

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push     #这里配置的地址为你自己的loki服务器日志收集的信息

scrape_configs:
- job_name: mysql
  static_configs:
  - targets:
      - localhost
    labels:
      job: mysql                         #这里为刚才选择job下子标签
      __path__: /var/log/*log            #将采集的日志放在/var/log/*log下自动发现

复制

3.7.2、编写 docker-compose.yaml 配置文件

version: "3"

services:
  promtail:
    image: grafana/promtail:2.0.0               #拉去镜像
    container_name: promtail-node               #镜像名称
    volumes:
      - /root/promtail/config.yml:/etc/promtail/config.yml    #挂载目录
      - /var/log:/var/log
    network_mode: 'host

复制
‍‍3.7.3、 启动
docker-compose -f docker-compose.yaml  up -d
复制
3.7.4、 去 loki 上查看发现已经多了一个mysql的job

3.8、查询包含password的日志

{job="mysql"} |~ "password"
复制

3.9、面是一些常见的查询示例

基本的标签过滤:

查询特定作业(job)的日志:
plaintext
{job="mysql"}
这个查询将返回所有作业标签(job)为 "mysql" 的日志条目。
字符串匹配:

查找包含特定字符串的日志:
plaintext
{job="mysql"} |~ "error"
这个查询将返回所有作业标签为 "mysql" 并且日志消息中包含 "error" 字符串的日志条目。
时间范围:

查找最近一小时内的日志:
plaintext
{job="mysql"} |>= 1h
这个查询将返回最近一小时内的所有作业标签为 "mysql" 的日志条目。
逻辑运算符:

组合多个条件进行筛选:
plaintext
{job="mysql"} |~ "error" unless {namespace="production"}
这个查询将返回所有作业标签为 "mysql",并且日志消息中包含 "error" 字符串,但排除 namespace 标签为 "production" 的日志条目。
聚合和排序:

按日志级别计数:
plaintext
{job="mysql"} | count by (level)
这个查询将按日志级别对作业标签为 "mysql" 的日志进行计数,并返回每个级别的日志条目数量。
组合多个操作:

结合多个操作符进行复杂查询:
plaintext
{job="mysql"} |~ "error" | count by (level) | topk(10, count)
这个查询首先筛选出作业标签为 "mysql" 并且日志消息中包含 "error" 字符串的日志条目,然后按日志级别计数,最后返回计数最高的前十个级别。

复制

---THE END---



文章转载自程序员恰恰,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论