Ubuntu 22.04 部署 Loki + promtail + grafana 收集 docker 日志
背景
- 安装 docker
- 安装 docker-compose
- 服务器IP:172.16.16.78

本次只部署日志展示
部署 loki
mkdir -p /data/docker-compose/loki/data
cd /data/docker-compose/loki
chown 10001:10001 data
cat >>docker-compose.yml <<EOF
version: '3.3'
services:
# Loki 日志存储服务
loki:
image: grafana/loki:2.9.15
container_name: loki
ports:
- "3100:3100"
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
- ./data:/loki
command: -config.file=/etc/loki/local-config.yaml
EOF
# 配置
vi loki-config.yaml
# 认证开关:禁用身份验证
auth_enabled: false
server:
# HTTP服务监听端口(默认3100)
http_listen_port: 3100
common:
# 数据存储根目录
path_prefix: /loki
storage:
# 本地文件系统存储
filesystem:
# 日志块存储目录(原始日志分块)
chunks_directory: /loki/chunks
# 告警/记录规则存储目录
rules_directory: /loki/rules
# 数据副本数(单节点部署设为1)
replication_factor: 1
ring:
# 当前节点通信地址(单机部署用127.0.0.1)
instance_addr: 127.0.0.1
kvstore:
# 环状态存储方式(内存存储,重启丢失)
store: inmemory
# 存储引擎配置
storage_config:
boltdb_shipper:
# 当前活跃索引存储目录(BoltDB索引文件)
active_index_directory: /loki/boltdb
# 索引缓存目录
cache_location: /loki/cache
# 最终存储类型(本地文件系统)
shared_store: filesystem
# 压缩与清理配置
compactor:
# 压缩工作目录
working_directory: /loki/compactor
# 存储类型(与shared_store一致)
shared_store: filesystem
# 启用日志保留清理
retention_enabled: true
# 压缩完成后延迟多久执行删除(防误删)
retention_delete_delay: 2h
# 删除操作的并行线程数
retention_delete_worker_count: 10
# 全局限制配置
limits_config:
# 日志保留周期(7天=168小时)
retention_period: 168h
# 日志块存储配置
chunk_store_config:
# 查询最大回溯时间(需≥retention_period)
max_look_back_period: 168h
# 索引模式配置
schema_config:
configs:
# 配置版本1(从指定日期生效)
- from: "2023-01-01"
# 索引存储引擎(boltdb-shipper)
store: boltdb-shipper
# 对象存储类型(本地文件系统)
object_store: filesystem
# 索引格式版本(v12支持TSDB)
schema: v12
index:
# 索引文件前缀
prefix: index_
# 索引分片时长(24小时分片一次)
period: 24h
# 启动
docker-compose up -d
部署 promtail
用来采集 docker 日志
mkdir -p /data/docker-compose/promtail
cd /data/docker-compose/promtail
cat >>docker-compose.yml <<EOF
version: '3.3'
services:
# Promtail 日志收集器
promtail:
image: grafana/promtail:2.9.15
ports:
- "9080:9080"
container_name: promtail
volumes:
- ./promtail-config.yaml:/etc/promtail/config.yml
- /var/run/docker.sock:/var/run/docker.sock
command: -config.file=/etc/promtail/config.yml
EOF
# 创建配置
vi promtail-config.yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://172.16.16.78:3100/loki/api/v1/push
# 使用增强版配置
scrape_configs:
- job_name: docker_java_logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
filters:
- name: label
values: ["logging=promtail"]
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
- source_labels: ['__meta_docker_container_log_stream']
target_label: 'logstream'
# 启动
docker-compose up -d
部署 grafana
mkdir -p /data/docker-compose/grafana/data
cd /data/docker-compose/grafana
chown 472:0 data
cat >>docker-compose.yml <<EOF
version: '3.3'
services:
grafana:
image: grafana/grafana:12.0.2
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_USER: admin # 用户名
GF_SECURITY_ADMIN_PASSWORD: klvchen123 # 密码
GF_DEFAULT_INSTANCE_NAME: Loki-Dashboard
EOF
# 启动
docker-compose up -d
配置 grafana 的数据源
浏览器访问 http://172.16.16.78:3000/

测试部署 java 应用
下面是我这边的镜像,其他人可自行测试,特别注意,需要加入 "logging=promtail" 的 label promtail 才会抓取日志
vi docker-compose.yml
version: '3.3'
services:
user-bff:
image: harbor.klvchen.com/3bur/user-bff:3
labels: # 注意这里要加 labels
- "logging=promtail"
deploy:
resources:
limits:
cpus: '2'
memory: 2G
restart: always
# 启动
docker-compose up -d
查询日志
http://172.16.16.78:3000/explore

查看 promtail 抓取了哪些服务的日志
浏览器访问 http://172.16.16.78:9080/targets

浙公网安备 33010602011771号