轻量级日志收集方案 Loki+Promtail+Grafana(简称LPG)
背景
之前为了方便查看生产环境SpringBoot应用的日志,搭建了ELK,但是对于一般的中小企业太过笨重,需要比较大的服务器资源,于是在网上找到了可以替换的解决方案,它就是LPG(不是LSP😁)。
介绍
LPG日志收集方案内存占用很少,经济且高效!它不像ELK日志系统那样为日志建立索引,而是为每个日志流设置一组标签。下面分别介绍下它的核心组件:
Promtail:日志收集器,有点像 Filebeat,可以收集日志文件中的日志,并把收集到的数据推送到Loki中去。Loki:聚合并存储日志数据,可以作为Grafana的数据源,为Grafana提供可视化数据。Grafana:从Loki中获取日志信息,进行可视化展示。
环境
本此演示环境Linux,docker版本20.10.7,docker-compose版本1.18.0
安装
实现这套日志收集方案需要安装Loki、Promtail、Grafana这些服务,直接使用docker-compose来安装非常方便。只要你掌握了少量 docker 和 docker-compose 相关知识即可搭建使用。
为了方便管理,我将创建三个目录,用来存放对应的Yaml配置文件。
Loki
-
创建
loki目录,用来存放loki.yml配置文件 -
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配置文件 -
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文件
编写 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 构建和启动服务
查看服务命令 docker-compose ps
访问 http://IP:3000 将会看到 grafana 可视化界面, 账号/密码:admin/admin
使用
-
在数据源选择界面中直接选择Loki
-
接下来只需要设置下你的Loki访问地址,然后点击最下方
Save&test即可 -
最后在
Explore就可以选择Springboot应用的Log文件 -
点击右上角
Run query,就可以查看到日志内容
总结
就是这么简单,就可以随时查看到SpringBoot应用的日志文件,对于项目日常的异常排错基本够用,更多更高级的用法请查看官方文档。