部署Promtail+Loki+Grafana (PLG架构)的日志服务

参考文档:

日志收集系统PLG(Promtail+Loki+Grafana)介绍及部署

Implementing the logging stack using Promtail, Loki, and Grafana using Docker-Compose

简介

Promtail 是代理, 负责收集日志并将其发送给 loki

Loki 是主服务器, 负责存储日志和处理查询

Grafana 用于 UI 展示

架构图

PLG Architecture

日志服务器上安装Loki和Grafana, 在应用程序服务器上安装promtail来收集日志然后发送给Loki存储, 就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够, 可以部署多个Loki进行存储及查询)

PLG工作流程

promtail收集并将日志发送给loki的Distributor组件

Distributor会对接收到的日志流进行正确性校验, 并将验证后的日志分批并行发送到Ingester

Ingester 接受日志流并构建数据块, 压缩后存放到所连接的存储后端

Querier 收到HTTP查询请求, 并将请求发送至Ingester 用以获取内存数据 , Ingester 收到请求后返回符合条件的数据

如果 Ingester 没有返回数据, Querier 会从后端存储加载数据并遍历去重执行查询 , 通过HTTP返回查询结果

对比ELK Stack(Elasticsearch+Logstash+Kibana)

ELK虽然功能丰富, 但规模复杂, 资源占用高, 操作苦难, 很多功能往往用不上

Loki不对日志进行全文索引而是通过存储压缩非结构化日志和索引元数据, Loki操作起来简单, 更省成本, 安装部署简单快速, 受 Grafana 原生支持

部署

部署的配置文件归档在Gitee-HKZC-DevOps-Tools

docker-compose中配置微模块文件路径的映射修改

这里截取部分compose文件的片段作为演示

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
loki:
# 如果需要使用宿主机的配置文件, 修改这里, 和下面的映射文件的配置二选一
# command:
# - "-config.expand-env=true"
# - "-config.file=/mnt/config/loki-config.yaml"
volumes:
- ./config/loki-config.yaml:/etc/loki/local-config.yaml # 映射本地配置文件到容器中/etc/loki/local-config.yaml, 这个路径在不同版本中可能不一致, 以容器内实际文件名和路径为准
promtail:
volumes:
- /var/log:/var/log # 将主机的日志目录挂载到 promtail 容器中
- /data/logs/focusin-log:/var/log/focusin-log # 挂载额外的日志目录, 如果挂载路径相同后面的配置会覆盖前面的
- ./config/promtail-config.yml:/etc/promtail/config.yml # 映射本地配置文件到容器中/etc/promtail/config.yml, 这个路径在不同版本中同样可能不一致

定义promtail的日志采集范围

promtail-docker-config.yaml文件中, 可以自定义数据采集的源

1
2
3
4
5
6
7
8
9
# 配置数据源 - java应用程序日志目录
scrape_configs:
- job_name: focusin-prod-logs
static_configs:
- targets:
- localhost
labels:
job: focusin-prod-logs
__path__: /var/log/focusin-log/prod/*/*.log # 配置要抓取的日志文件路径

这里__path__定义了数据采集的路径(这里这个路径是容器内的路径, 需要在compose中配置宿主机到容器的映射), 修改完成后可以在Grafana中使用{job="focusin-prod-logs"}精确匹配采集的所有日志

配置Nginx转发要注意的事项

CORS错误的解决

在配置完成Nginx转发后, 一定要加上这一行, 否则会触发CORS错误

proxy_set_header Host $http_host;

参考资料可见grafana-9-origin-not-allowed

具体原因详情可见Unable to Create/Save Dashboard after v8.3.5 Update

日志Live模式不生效的解决

Loki导入数据源后日志实时展示出现

Live tailing was stopped due to following error: undefined

Not all proxies can transparently proxy WebSocket connections by default. For example, if you are using Nginx before Grafana you need to configure WebSocket proxy

官网文档的说明中可知需要在NGINX中添加如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
...

location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_pass http://grafana;
}
}

如果还存在这个问题, 可以尝试在DataSource上配置header