部署Promtail+Loki+Grafana(PLG架构)的日志服务
部署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 展示
架构图
在日志服务器上安装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 | services: |
定义promtail的日志采集范围
在promtail-docker-config.yaml
文件中, 可以自定义数据采集的源
1 | # 配置数据源 - java应用程序日志目录 |
这里__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 | map $http_upgrade $connection_upgrade { |
如果还存在这个问题, 可以尝试在DataSource上配置header