Loki+Promtail+Grafana 我们不是LSP

5,199 阅读3分钟

轻量级日志收集方案 Loki+Promtail+Grafana(简称LPG)

背景

之前为了方便查看生产环境SpringBoot应用的日志,搭建了ELK,但是对于一般的中小企业太过笨重,需要比较大的服务器资源,于是在网上找到了可以替换的解决方案,它就是LPG(不是LSP😁)。

介绍

LPG日志收集方案内存占用很少,经济且高效!它不像ELK日志系统那样为日志建立索引,而是为每个日志流设置一组标签。下面分别介绍下它的核心组件:

  • Promtail:日志收集器,有点像 Filebeat,可以收集日志文件中的日志,并把收集到的数据推送到Loki中去。
  • Loki:聚合并存储日志数据,可以作为Grafana的数据源,为Grafana提供可视化数据。
  • Grafana:从Loki中获取日志信息,进行可视化展示。

环境

本此演示环境Linuxdocker版本20.10.7docker-compose版本1.18.0

安装

实现这套日志收集方案需要安装LokiPromtailGrafana这些服务,直接使用docker-compose来安装非常方便。只要你掌握了少量 dockerdocker-compose 相关知识即可搭建使用。

为了方便管理,我将创建三个目录,用来存放对应的Yaml配置文件。

image.png

Loki

  • 创建loki目录,用来存放loki.yml配置文件

    image.png

  • loki.yml

    auth_enabled: false
    
    server:
      http_listen_port: 3100
    
    ingester:
      lifecycler:
        address: 127.0.0.1
        ring:
          kvstore:
            store: inmemory
          replication_factor: 1
        final_sleep: 0s
      chunk_idle_period: 1h       # 此时没有接收到新日志的任何块都将被刷新
      max_chunk_age: 1h           # 所有的块将刷新时,他们达到这个年龄,默认是1h
      chunk_target_size: 1048576  # Loki将尝试构建最大为1.5MB的块,如果先达到chunk_idle_period或max_chunk_age,则首先刷新
      chunk_retain_period: 30s    # 如果使用索引缓存,必须大于索引读缓存TTL(默认索引读缓存TTL为5m)
      max_transfer_retries: 0     # 块传输禁用
    
    schema_config:
      configs:
        - from: 2021-9-8
          store: boltdb-shipper
          object_store: filesystem
          schema: v11
          index:
            prefix: index_
            period: 24h
    
    storage_config:
      boltdb_shipper:
        active_index_directory: /loki/boltdb-shipper-active
        cache_location: /loki/boltdb-shipper-cache
        cache_ttl: 24h         # 可以在更长的查询周期内提高更快的性能,使用更多的磁盘空间
        shared_store: filesystem
      filesystem:
        directory: /loki/chunks
    
    compactor:
      working_directory: /loki/boltdb-shipper-compactor
      shared_store: filesystem
    
    limits_config:
      reject_old_samples: true
      reject_old_samples_max_age: 168h
    
    chunk_store_config:
      max_look_back_period: 0s
    
    table_manager:
      retention_deletes_enabled: false
      retention_period: 0s
    
    ruler:
      storage:
        type: local
        local:
          directory: /loki/rules
      rule_path: /loki/rules-temp
      alertmanager_url: http://localhost:9093
      ring:
        kvstore:
          store: inmemory
      enable_api: true
    

Promtail

  • 创建protail目录, 存放promtail.yml配置文件

    image.png

  • promtail.yml

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    clients:
      - url: http://loki:3100/loki/api/v1/push
    
    scrape_configs:
    - job_name: system
      static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*log
    

创建lpg目录,存放docker-compose.yml文件

image.png

编写 docker-compose.yml 文件

version: "3"

services:
  # 日志存储和解析
  loki:
    image: grafana/loki
    container_name: lpg-loki
    volumes:
      - /root/docker/loki/:/etc/loki/
    # 修改loki默认配置文件路径
    command: -config.file=/etc/loki/loki.yml
    ports:
      - 3100:3100

  # 日志收集器
  promtail:
    image: grafana/promtail
    container_name: lpg-promtail
    volumes:
      # 将需要收集的日志所在目录挂载到promtail容器中
      - your_project_path/logs/:/var/log/
      - /root/docker/promtail:/etc/promtail/
    # 修改promtail默认配置文件路径
    command: -config.file=/etc/promtail/promtail.yml

  # 日志可视化
  grafana:
    image: grafana/grafana
    container_name: lpg-grafana
    ports:
      - 3000:3000

⚠️⚠️⚠️ loki.volumes promtail.volumes 确保正确挂载的路径

⚠️⚠️⚠️ promtail.volumes.your_project_path 需要收集日志的SpringBoot应用存放Log文件的目录

lpg目录下,运行命令 docker-compose up -d 构建和启动服务

image.png

查看服务命令 docker-compose ps image.png

访问 http://IP:3000 将会看到 grafana 可视化界面, 账号/密码:admin/admin image.png

使用

  • 在数据源选择界面中直接选择Loki
    image.png

    image.png

  • 接下来只需要设置下你的Loki访问地址,然后点击最下方Save&test即可 image.png

  • 最后在Explore就可以选择Springboot应用的Log文件 image.png

  • 点击右上角 Run query,就可以查看到日志内容 image.png

    image.png

总结

就是这么简单,就可以随时查看到SpringBoot应用的日志文件,对于项目日常的异常排错基本够用,更多更高级的用法请查看官方文档。

参考资料

Promtail

Loki

Grafana