轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言

Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。

现在目前成熟的方案基本上都是:Logstash + Elasticsearch + Kibana (LEK),但是LEK对资源要求比较高,少了8H8G用起来都是一卡一卡的,所以我们可以转向比较轻量的方案 Promtail + Loki + Grafana (PLG),本文就介绍PLG这种方案,可以对接各种云存储,比如Minio、S3、COS、OSS等等。

介绍

Grafana Loki

官方:Grafana Loki OSS | Log aggregation system

开源地址:GitHub - grafana/loki: Like Prometheus, but for logs.

Loki 是一个日志聚合系统,旨在存储和查询来自所有应用程序和基础设施的日志。

Grafana

官方:Grafana | Query, visualize, alerting observability platform

开源地址:GitHub - grafana/grafana: The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.

一个监控面板,查询、可视化、警报和理解您的数据,无论数据存储在何处。借助 Grafana,您可以通过美观、灵活的仪表板创建、探索和共享所有数据。

Promtail

Promtail 是一个代理,它将本地日志的内容发送到私有 Grafana Loki 。它通常部署到运行需要监视的应用程序的每台计算机。

开始部署

推荐配置2H4G比较丝滑。

参考官方部署手册:Quickstart to run Loki locally | Grafana Loki documentation

官方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,密码:admin

Loki作为一个活跃的开源项目,持续地接受着来自全球开发者社区的贡献和维护,确保了它能够适应不断变化的云原生环境需求。对于那些寻求高效、经济的日志管理解决方案的开发团队和企业来说,Loki是一个值得深入探索的强大工具。

默认已经在配置文件中加入了loki数据源,直接点击测试是否可用:

直接预览日志,搜索自己手动添加的测试日志,没问题搭建完成。

物理部署protmail

若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。

首先到loki发布版本这里下载对应操作系统的安装包:Releases · grafana/loki · GitHub

新建配置文件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配置可参考链接:Promtail agent | Grafana Loki documentation

资源占用

最后我们来看下轻量级的Promtail + Loki + Grafana + Minio 整个容器占用的内存大小。

总共加起来300MB不到,相当的丝滑,若你只是需要收集一些自己折腾玩的服务日志太合适不过了。

总结

本文通过对比不同的日志平台,最终实战搭建了Promtail + Loki + Grafana + Minio,实打实的可以用于生产,但是要注意生产环境的HA部署以及参考官方文档进行优化,比如不同租户的请求速度频率的限制大小,日志的保留时长,最大上传的日志大小等等配置,希望本文对大家有所帮助。

相关推荐
jekc8687 小时前
Ubuntu安装grafana
linux·ubuntu·grafana
OpsEye17 小时前
Grafana功能菜单介绍
信息可视化·grafana
TiDB 社区干货传送门2 天前
使用 Grafana 展示多个TiDB集群的告警
linux·服务器·数据库·tidb·grafana
人生如叶2 天前
运维监控grafana+prometheus+node_exporter(&or mysqld_exporter)
运维·grafana·prometheus
BUG弄潮儿2 天前
Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards
grafana·prometheus
明月与玄武4 天前
企业级资源监控方案落地:Prometheus+Grafana+Export
grafana·prometheus·exporter
vibag4 天前
prometheus&grafana实现监控告警
java·大数据·grafana·prometheus
cominglately4 天前
部署loki,grafana 以及springcloud用法举例
grafana·loki·日志管理
真上帝的左手4 天前
十七、监控与度量-Prometheus/Grafana/Actuator
grafana·prometheus