Loki介绍
Loki 是 Grafana Labs 开源的日志聚合系统,常被称为 “日志界的 Prometheus”。它的设计理念是只索引元数据,不索引完整日志内容,结合 Promtail 和 Grafana,就能实现高效的日志采集、存储与可视化。与传统的 ELK(Elasticsearch + Logstash + Kibana)方案相比,Loki 部署更轻量、存储成本更低,对资源要求小,非常适合与容器和 Kubernetes 环境结合使用。同时,Loki 在查询时依赖标签(labels)过滤,再结合 Grafana 强大的可视化能力,让日志分析更直观灵活。
部署步骤
部署目录
root@test-midware-0001:/data/grafana# ls -l total 12 -rw-r--r-- 1 root root 1614 Sep 23 15:45 docker-compose.yaml -rw-r--r-- 1 root root 424 Sep 23 15:37 loki-config.yaml -rw-r--r-- 1 root root 1508 Sep 23 15:53 promtail-config.yaml drwxr-xr-x 2 root root 6 Sep 28 16:02 promtail-data
本次采用docker-compose的方式部署loki及其相关的组件。以下是详细的docker-compose.yaml文件内容:
version: '3.8'services:loki:image: grafana/loki:2.9.8container_name: lokiports:- "32100:3100"volumes:- ./loki-config.yaml:/etc/loki/local-config.yaml:ro # 配置挂载- loki_data:/loki # 存储日志/chunks/index 数据- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:rocommand: -config.file=/etc/loki/local-config.yamlrestart: unless-stoppednetworks:- grafana-netpromtail:image: grafana/promtail:2.9.8 # 最近 stable 的带安全补丁版本container_name: promtaildepends_on:- lokicommand: -config.file=/etc/promtail/config.yaml -log.level=infovolumes:- /var/run/docker.sock:/var/run/docker.sock:ro # promtail需要使用docker API- /data/docker/containers:/var/lib/docker/containers:ro # 日志目录挂载- ./promtail-config.yaml:/etc/promtail/config.yaml:ro # 配置文件挂载 - ./promtail-data:/tmp # 临时文件挂载,记录日志位置- /etc/localtime:/etc/localtime:ro # 时区- /etc/timezone:/etc/timezone:rouser: rootrestart: unless-stoppednetworks:- grafana-netgrafana:image: grafana/grafanacontainer_name: grafanadepends_on:- loki- promtailenvironment:- GF_SECURITY_ADMIN_PASSWORD=******* #这里设置自己的密码 - GF_AUTH_ANONYMOUS_ENABLED=false# 其他环境变量配置你自己的需求ports:- "23100:3000"volumes:- grafana_data:/var/lib/grafana- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:rorestart: unless-stoppednetworks:- grafana-netvolumes:loki_data:grafana_data:networks:grafana-net:external: true
这里有一个需要注意的点是,容器网络需要提前创建好
$ docker network create grafana-net
上面的docker-compose.yaml中有三个容器,分别是grafana,日志展示的UI。Loki日志存储服务端和promtail日志收集端。后面两个需要挂载配置文件,这也得提前编辑好。
root@test-midware-0001:/data/grafana# cat loki-config.yaml auth_enabled: falseserver:http_listen_port: 3100common:path_prefix: /lokistorage:filesystem:chunks_directory: /loki/chunksrules_directory: /loki/rulesreplication_factor: 1ring:kvstore:store: inmemoryschema_config:configs:- from: 2020-10-24store: tsdbobject_store: filesystemschema: v13index:prefix: index_period: 24h
root@test-midware-0001:/data/grafana# cat promtail-config.yaml server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://loki:3100/loki/api/v1/push scrape_configs:# -------------------------------# 1. Docker 容器日志# -------------------------------- job_name: docker-logsdocker_sd_configs:- host: unix:///var/run/docker.sock refresh_interval: 5srelabel_configs:# 容器名称(去掉开头的 /)- source_labels: [__meta_docker_container_name]target_label: container_nameregex: '/(.*)'replacement: '$1'# 给特定容器(比如名字里包含 ls-device)加标签 project_name=ls-device- source_labels: [__meta_docker_container_name]regex: .*ls-device.*target_label: project_namereplacement: ls-device# 容器 ID- source_labels: [__meta_docker_container_id]target_label: container_id# 镜像名称- source_labels: [__meta_docker_image]target_label: image# 日志路径- source_labels: [__meta_docker_container_id]target_label: __path__replacement: /var/lib/docker/containers/$1/*.logpipeline_stages:# 解析 Docker json-file 日志格式- docker: {}# 将日志的 time 字段作为 timestamp- timestamp:source: timeformat: RFC3339Nano# 丢弃超过 7 天的旧日志- drop:older_than: 168h
启动容器
docker-compose up -d
登录grafana
配置Loki数据源,并保存。
再次点击探索就可以查看到我们添加的Loki数据源了
我们可以点击标签过滤,按容器名或者项目名来查找特定的日志。