受Prometheus启发的开源日志工具:Loki

简介: 提及日志收集搜索框架,最常看到的解决方案就是 **ELK**。虽然现在有 Docker、k8s 帮我们简化了部署流程,但 **ELK** 对硬件的要求却很高。光是 **Elasticsearch** 官网就提及到需要 8 GB 内存以上的机器部署,可见占据的资源之多。为了能降本增效(**穷~~~**),在网上看到了 Grafana 团队的日志框架: **Loki**。为此进行了深入的了解并应用在了一些项目上。

前言

提及日志收集搜索框架,最常看到的解决方案就是 ELK。虽然现在有 Docker、k8s 帮我们简化了部署流程,但 ELK 对硬件的要求却很高。光是 Elasticsearch 官网就提及到需要 8 GB 内存以上的机器部署,可见占据的资源之多。为了能降本增效(穷~~~),在网上看到了 Grafana 团队的日志框架: Loki。为此进行了深入的了解并应用在了一些项目上。

Loki 介绍

Loki 是 Grafana 团队开源的一款高可用、高拓展、多租户的日志聚合系统,和 ELK 的组件功能一样,Loki 有负责日志存储查询的主服务,有在客户端负责收集日志并推送的代理服务,还有 Grafana 最拿手的可视化面板展示。

不同的是,Loki 不再根据日志内容去建立大量的索引,而是借鉴了 Prometheus 核心的思想,使用标签去对日志进行特征标记,然后归集统计。这样的话,能避免大量的内存资源占用,转向廉价的硬盘存储。当然 Loki 会对日志进行分块存储并压缩,保留少量的元数据索引,兼顾硬盘的查询效率。

除此之外,Loki 还有以下特性:

  • 一个 Loki 实例允许面向多个租户,不同租户的数据完全与其他租户隔离。
  • LogQL:Loki 自己的日志查询语言,很容易上手使用的。
  • 高拓展性,Loki 的所有组件可以跑在同一个程序里,也可以按微服务的方式去部署它们。
  • 支持市面上许多流行的日志客户端插件,能较好的集合在一起。

说白了,Loki 吸引人的地方就在于拥有和 Prometheus 类似机制的时序数据库以及方便拓展的硬盘资源。

Loki 架构

下面,我们来认识下 Loki 的总体架构。就像前面提及到的,Loki 主要分为了三部分:

  • agent client:日志代理客户端,负责收集日志发送到主服务 Loki,目前官方有自己的 client: Promtail,也支持主流的组件,如 Fluentd、Logstash、Fluent Bit 等。
  • loki:日志主服务,负责存储收集到的日志以及对日志查询解析。
  • grafana:日志数据展示面板。

Loki 总体架构

可以看到,核心的组件其实是 Loki 这个主服务,关于它的内部组成,其实还可以细分为几部分:

  • Distributor:负责处理客户端发送过来的日志数据,检验正确性后将其分发给后续组件。
  • Ingester:负责将日志按块存储。
  • Query frontend:可选服务,对外提供查询 API,负责一些查询调整和整合。

Loki 组成

Loki 的简单使用

Loki 的安装

关于 Loki 的安装非常的简单,大伙可以看官网的连接:Install Grafana Loki with Docker or Docker Compose。本人实践了一下,使用了下面的 yaml 文件,以 docker-compose 方式进行了部署:

version: "3"

services:
    loki:
        image: grafana/loki:2.4.0
        ports:
          - "3100:3100"
        command: -config.file=/etc/loki/config.yaml
        volumes:
            - ./config/loki:/etc/loki
            - loki-vm:/loki
    grafana:
        image: grafana/grafana:7.3.0
        ports:
          - "3000:3000"
        volumes:
            - grafana-vm:/var/lib/grafana
        environment:
            GF_SECURITY_ADMIN_PASSWORD: 123456
            GF_SERVER_HTTP_PORT: 3000
    promtail:
        image: grafana/promtail:2.4.0
        volumes:
          - /var/log:/var/log
        command: -config.file=/etc/config.yml
        network_mode: "host"
        volumes:
            - "./config/promtail/etc:/etc"
            - "./my-service/log:/var/log"
            - "./my-service/log-position:/var/log-position"
volumes:
  grafana-vm:
  loki-vm:

其中,关于 Loki 的配置文件,在本机的 ./config/loki 目录下需要有个 config.yaml,配置如下:

auth_enabled: false

server:
  http_listen_port: 3100
  log_level: 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
  wal:
    dir: /loki/wal

compactor:
  working_directory: /loki/persistent      # 压缩目录,一般也作为持久化目录
  compaction_interval: 10m                 # 压缩间隔
  retention_enabled: true                  # 持久化开启
  retention_delete_delay: 5m               # 过期后多久删除
  retention_delete_worker_count: 150       # 过期删除协程数目
schema_config:
    configs:
      - from: "2020-07-31"
        index:
            period: 24h
            prefix: loki_index_
        object_store: filesystem          # 持久化方式:本地文件
        schema: v11
        store: boltdb-shipper
storage_config:
    boltdb_shipper:
        active_index_directory: /loki/boltdb-index    # index 目录
        cache_location: /loki/boltdb-cache            # cache 目录
    filesystem:
        directory: /loki/chunks                       # chunks 目录
limits_config:
  retention_period: 240h                              # 多久过期

关于 promtail 的配置文件,在本机的 ./config/promtail/etc 目录下需要有个 config.yaml,配置如下:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /var/log-position/positions.yaml # 日志上传位置

client:
  url: http://127.0.0.1:3100/loki/api/v1/push

scrape_configs:
- job_name: my-service
  static_configs:
  - targets:
      - localhost
    labels:
      job: my-service
      __path__: /var/log/*.log

其中,在 promtail 的配置文件里有 __path__ 路径,这个就是我们想要上传的日志文件路径了,它支持正则表达式。这样的话,只要我们的服务有新的日志文件产生,那么它就会被推送到 Loki 了。

Grafana 的使用

上面将会把日志数据推送到 Loki ,接下来我们就可以使用 Grafana 里的数据展示面板来查询我们的日志了。在使用之前,我们还得配置下 Grafana,在 http://服务器地址:3000 里输入配置的账号密码后,按以下步骤配置:

Data Sources 配置:

Grafana

Grafana

Grafana

Grafana

Manage 的配置:

Grafana

Grafana

Grafana

Grafana

Grafana

最后一张图的输入框就是我们想要查找日志关键字的地方了!

日志的标签

除了有 String Match 的输入外,我们还看到了 App 的选择。而这个 App 的选择就是我们提及 Loki 的重点:标签。此标签是我们在 promtail 配置文件里 scrape_configs 下的 label 里的。只要我们在这里配置一些标签,那么就可以对收集的日志进行标记然后在此过滤了,比如服务名、命名空间等。此外,它还支持 json 等格式的标签解析。

日志查询语言: LogQL

为了能满足各式各样的查询,比如包含、不包含、正则等查询,Loki 开发了属于自己的日志查询语言:LogQL。它就像 Prometheus 的 PromQL 一样,具有丰富的查询语义,例如我们可以点击如下的查询按钮:

Grafana

就会跳转到如下界面:

Grafana

如果我们想要查找日志不包含某些关键字的,那么可以这么输入:

{job="my-service"} != "内容"

LogQL 的使用非常简单,这里罗列一些常用的语法:

|=: 包含
!=: 不包含
|~: 正则匹配
!~: 不在正则匹配里的

总体上来讲,LogQL 的过滤分为了三种过滤,分别如下:

  • 标签匹配(Label matchers):例如 {job="my-service"},一般至少需要一个标签匹配,否则将检索所有数据了。
  • 行过滤器(Line filters):例如 != "内容",是对日志内容进行匹配过滤的。
  • 标签过滤器(Label filters):需要对标签进行转换计算,效率较低。

在 Loki 的官网里,有关于日志查询的一些最佳实践,下面总结罗列一下,方便大家部署时注意:

  • 尽量使用静态标签,不使用动态标签,以免产生大量的小块文件
  • 在配置文件里尽量使用缓存,能加快查询速度,配置支持 in-memory、memcached 和 redis。
  • Loki 的过滤效果是按标签匹配(Label matchers)、行过滤器(Line filters)、 标签过滤器(Label filters)逐级递减的,过滤条件越到后面匹配,将会越慢。尽量在前面就进行条件过滤。

遇到的问题

过期配置

在使用本地模式收集日志时,希望日志的存储能在一定时间后清除,以免无限增加。当时看了官网的 Table ManagerCompactor。尝试了多种配置后,一直不生效,后面才发现,需要在 limits_config 里也配置。

查询超时

当前使用 Loki 的时候,发现查询日期较远,查询较复杂时,会出现 time out 情况,并且会莫名重启。后面发现原来是 2.4.0 的版本有 bug,会不定时的出现 AllByUserID 的空指针访问。后面更新到最新的 2.4.2 版本就可以了。

总结

Loki 在使用的过程中,确实比较方便简单,特别是集合了 Grafana 的查询面板以及它的类 Prometheus 的标签机制,让我们的日志解决方案更加轻量。使用 Loki 期间也确实遇到了很多问题,大伙如果有兴趣的话,可以尝试上手,后续一起交流探讨。

相关文章
|
10月前
|
Prometheus 监控 Cloud Native
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
795 79
|
8月前
|
运维 安全 数据可视化
日志审查安排工具实战攻略:中小团队如何通过日志审查安排工具建立可控、安全的审查机制?
在审计敏感时代,日志审查安排工具成为安全运维与合规管理的关键利器。它实现审查任务的流程化、周期化与可视化,支持多系统协作、责任到人,确保“可控、可查、可追”的日志治理。工具如板栗看板、Asana、Monday 等提供任务调度、问题闭环与合规对接能力,助力企业构建高效、透明的日志审查体系,提升安全与合规水平。
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
4769 71
Grafana Loki,轻量级日志系统
|
9月前
|
JavaScript API 开发工具
HarmonyOS NEXT实战:日志工具
本文介绍了在HarmonyOS Next应用开发中,如何封装一个简单易用的日志工具LoggerKit。通过使用系统提供的HiLog API,开发者可以灵活输出不同级别的日志信息(DEBUG、INFO、WARN、ERROR、FATAL),用于分析应用运行状态和调试逻辑问题。文章详细说明了日志级别、参数配置及使用注意事项,并提供了完整的TypeScript封装示例代码,便于实际项目集成与应用调试。
214 0
|
人工智能 监控 算法
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
3D-Speaker是阿里巴巴通义实验室推出的多模态说话人识别开源项目,结合声学、语义和视觉信息,提供高精度的说话人识别和语种识别功能。项目包含工业级模型、训练和推理代码,以及大规模多设备、多距离、多方言的数据集,适用于多种应用场景。
3772 18
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
563 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
|
人工智能 算法 数据挖掘
开源更新|通义3D-Speaker多说话人日志功能
开源更新|通义3D-Speaker多说话人日志功能
|
Prometheus 监控 Cloud Native
无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?
Prometheus 是一个完全开源的系统监控和告警工具包,受 Google 内部 BorgMon 系统启发,自2012年由前 Google 工程师在 SoundCloud 开发以来,已被众多公司采用。它拥有活跃的开发者和用户社区,现为独立开源项目,并于2016年加入云原生计算基金会(CNCF)。Prometheus 的主要特点包括多维数据模型、灵活的查询语言 PromQL、不依赖分布式存储、通过 HTTP 拉取时间序列数据等。其架构简单且功能强大,支持多种图形和仪表盘展示模式。安装和使用 Prometheus 非常简便,可以通过 Docker 快速部署,并与 Grafana 等可
6237 2
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
593 8
|
9月前
|
Prometheus 监控 Cloud Native
云原生监控实战:Prometheus+Grafana快速搭建指南
云原生监控实战:Prometheus+Grafana快速搭建指南