前言

在微服务以及云原生时代,由于应用部署到遍地是,为了不像传统的方式上每台应用服务器筛选日志,那么我们可以使用日志管理平台,将所有日志都采集到统一的平台,供运维和研发人员快速排查故障,进而提升效率。

这样的日志平台云厂商有提供,比如腾讯云的日志服务CLS,阿里云日志SLS,百度云日志服务BLS,天翼云日志服务CT-LTS,谷歌云Cloud Logging等等。

若你是大中型公司那么肯定运维把这些都做好了,也不用考虑任何成本问题,但是在金融等风险行业,云产品基本是零信任,因为日志中可能打了敏感等身份,要用那也必须要自建。

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

介绍

Grafana Loki

官方:https://grafana.com/oss/loki/

开源地址:https://github.com/grafana/loki

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

Grafana

官方:https://grafana.com/grafana/

开源地址:https://github.com/grafana/grafana

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

Promtail

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

开始部署

推荐配置2H4G比较丝滑。

参考官方部署手册:https://grafana.com/docs/loki/latest/get-started/quick-start/

官方docker-compose快速部署架构图有下面这些组件:使用的最新版本3.1.x

轻量级日志管理平台Grafana Loki搭建及应用

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,密码:www.51it.wang

轻量级日志管理平台Grafana Loki搭建及应用

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

轻量级日志管理平台Grafana Loki搭建及应用

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

轻量级日志管理平台Grafana Loki搭建及应用

物理部署protmail

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

首先到loki发布版本这里下载对应操作系统的安装包:https://github.com/grafana/loki/releases

新建配置文件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配置可参考链接:https://grafana.com/docs/loki/latest/send-data/promtail/

资源占用

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

轻量级日志管理平台Grafana Loki搭建及应用

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

总结

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

参考链接

Promtail+Loki+Grafana搭建轻量级日志管理平台

Request Validation and Rate-Limit Errors

日志监控系统 loki 配置文件详解

Loki、promtail、Grafana、Prometheus日志监控安装与配置

Loki被限流了,Limits_Config到底限了个啥?

将日志转发到 Loki

grafana loki答疑

loki查询超时配置优化

Promtail agent官方文档

轻量级日志收集系统 Grafana Loki 初上手

failed to get token ranges for ingester err="zone not set"

文章目录