PLG(Promtail + Loki + Grafana)日志系统生产快速实践

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

在这里插入图片描述

随着公司业务发展,支撑公司业务的各种系统越来越多,为了保证公司的业务正常发展,急需要对这些线上系统的运行进行监控,做到问题的及时发现和处理,最大程度减少对业务的影响。因此有必要引入一套日志监控系统。

ELK (Elasticsearch 、 Logstash和Kibana) 是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦难,有点杀鸡用牛刀了。

PLG (Promtail + Loki + Grafana) 轻量级的,配置要求也不高(最后有个简单的实验),功能简单,但是目的明确,就是日志采集。

如果是简单进行日志查询,硬件资源不充裕那 PLG 绝对是好选择。

1.简介

Promtail: 日志收集的代理,安装部署在需要收集和分析日志的服务器,promtail会将日志发给Loki服务。

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

Grafana:提供web管理界面,数据展示功能。

https://grafana.com/docs/

PLG 官方文档很丰富,大家可以在网络上找到丰富的资料,这里就不多讲解了。

2.PLG 安装

Loki: https://grafana.com/docs/loki/latest/installation/

Grafana:https://grafana.com/docs/grafana/latest/setup-grafana/installation/

Promtail:https://grafana.com/docs/loki/latest/clients/promtail/installation/

安装都很简单
这里使用源码安装:

loki 和 promtail 可以到这里下载 https://github.com/grafana/loki/releases/

Grafana 下载地址:https://grafana.com/grafana/download?platform=linux

2.1 loki 安装

下载:

wget https://github.com/grafana/loki/releases/download/v2.7.1/loki-linux-amd64.zip

下载配置:

wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml

解压&启动:

unzip loki-linux-amd64.zip
./loki-linux-amd64 --config.file loki-local-config.yaml

2.2 promtail 安装

下载:

wget https://github.com/grafana/loki/releases/download/v2.2.1/promtail-linux-amd64.zip

下载配置:

wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml

解压&启动:

unzip promtail-linux-amd64.zip
./promtail-linux-amd64 --config.file promtail-local-config.yaml

2.3 Grafana 安装

下载:

wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.6.linux-amd64.tar.gz

解压&启动:

tar -zxvf grafana-enterprise-9.3.6.linux-amd64.tar.gz
./grafana-9.3.6/bin/grafana-server

经过上面的步骤后就算是安装成功了,接下来讲解下生产环境下我们是怎么使用的。

3.生产如何配置

3.1 loki 配置

下面是一般生产上使用的配置,更多详细配置可以参考https://grafana.com/docs/loki/latest/configuration/

auth_enabled: false

server:
  http_listen_port: 3100  # http 端口
  grpc_listen_port: 9096

common:
  path_prefix: /data/loki
  storage:
    filesystem:  # loki 存储位置
      chunks_directory: /data/loki/chunks
      rules_directory: /data/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100
compactor:
  working_directory: /data/loki/compactor      # 压缩目录,一般也作为持久化目录
  compaction_interval: 10m                 # 压缩间隔
  retention_enabled: true                  # 持久化开启
  retention_delete_delay: 2h               # 过期后多久删除
  retention_delete_worker_count: 150       # 过期删除协程数目
schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h  

ruler:
  alertmanager_url: http://localhost:9093
limits_config:
  reject_old_samples: true   # 是否拒绝旧样本
  reject_old_samples_max_age: 168h   # 168小时之前的样本被拒绝

chunk_store_config:
  max_look_back_period: 168h  # 为避免查询超过保留期的数据,必须小于或等于下方的时间值
table_manager:
  retention_deletes_enabled: true   # 保留删除开启
  retention_period: 168h  # 超过168h的块数据将被删除,必须为24h的倍数

3.2 promtail 配置

下面以一个简单的例子:

LOG [INFO][2023-02-06 17:29:50 +0800] [][reactor-http-epoll-6]  K-Trace-Id:[63e0c88ed5de1c4cc5ace63b],method:POST,url:http://10.0.0.102/api/report/open/buried,body:{"eventTypeId":49,"ip":"10.0.2.55","userId":"10006429","referrer":"http://localhost:8081/","equipment":"pc"} 
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://10.0.0.32:3100/loki/api/v1/push  # 推送到loki地址 
scrape_configs:
- job_name: logs  # 唯一
  static_configs:
  - targets:
      - localhost  # 读取本地文件
    labels: # labels 用户loki labels查询
      job: admin-service
      __path__: /data/logs/admin-service/*/*info.log  # 读取后缀为info.log的日志文件
  - targets:
      - localhost  
    labels: 
      job: gateway-service
      __path__: /data/logs/gateway-service/*/*info.log 
  pipeline_stages:
    - match:
        selector: '{job="admin-service"}' #  job为admin-service可以匹配到
        stages:
        - multiline:
            firstline: '^LOG'  # LOG开头进行多行合并
        - regex:
            expression: '.*(?P<level>INFO|WARN|ERROR).*' # 正则匹配解析 level 
        - timestamp:
            format: RFC3339Nano
            source: timestamp
        - labels:
            timestamp:
            level:  # 将level 作为以一个标签 ,label loki会建立索引,加快查询
    - match:
        selector: '{job="gateway-service"}'
        stages:
        - multiline:
            firstline: '^LOG'  
        - regex:
            expression: '.*(?P<level>INFO|WARN|ERROR).*'
        - timestamp:
            format: RFC3339Nano
            source: timestamp
        - labels:
            timestamp:
            level: 

个人使用中觉得 match 下面的自定义 label ,在实际使用中很有用,可以非常方便的进行自定义查询,速度很快。

3.2 Grafana配置

Grafana 无需修改配置文件,而是直接在页面上配置。Grafana 默认端口为 3000

http://10.0.0.32:3000/
10.0.0.32 为你安装Grafana 机器地址
在这里插入图片描述
默认账号和密码 均为 admin。

1.登录后添加数据源。

在这里插入图片描述
选择loki
在这里插入图片描述

2.配置loki地址

在这里插入图片描述
点击 Save & test 完成loki配置
在这里插入图片描述

3.开始日志查询

在这里插入图片描述

4.常见查询场景
1.根据label 查询

​ 可以查到的label 都在promtail 配置中labels中配置。
在这里插入图片描述
​ 这个就表示查询 job 为 kakaclo-gateway-service 的日志。
在这里插入图片描述
这个表示 查询 level为 INFO 的日志。
在这里插入图片描述
也可以组合起来查询。
在这里插入图片描述

2.根据内容查询

一个很常见的场景就是想更具日志中某个内容进行查询,如根据 trace_id或某个特定的日志内容 进行查询。
在这里插入图片描述

日志查询可以支持很多条件, 具体可以参考https://grafana.com/docs/loki/latest/logql/

4.资源消耗测试

测试环境 16G 8核机器,日均日志量300M。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行两天,cpu 1.7% ,内存 消耗 16*0.8% = 0.128G = 131M 。

日志原始文件 420M ,loki 压缩后消耗 26M。

这么看资源消耗还是相当少的,日志压缩率 达到 6.2%。

5.Grafana Dashboards

生产环境中不是所有人都拥有 admin权限,但是又想查看对应的日志。这个时间就可以用到 Dashboard,生成Dashboard可以方便只读权限人员查看日志。下面推荐个loki很实用的Dashboard
https://grafana.com/grafana/dashboards/13639-logs-app/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导入后就可以loki数据源就可以用了
在这里插入图片描述
在这里插入图片描述

5.生产实践的一些建议

1. 日志最好有统一规范

日志统一后方便提取共同的标签 如

ACTLOG [INFO][2023-02-13 17:16:02 +0800] [63e9ffd2d5de0bbaf7e4d890][NettyServer-10.0.0.121:8002-3-thread-19] com.happotech.actmgr.motan.service.impl.ActMgrServiceImpl.getAccountInfoThird(ActMg

这个可以方便定位日志属于那个系统 ,日志等级,日志时间,日志内容,链路id。如果日志格式不统一,那定位不同系统的问题起来就会很蛋疼。

2. 最好拥有全路径 trace_id

有了全路径id后查找问题那就是顺藤摸瓜的事,效率相当高

这里具体可以参考:

https://blog.youkuaiyun.com/AndCo/article/details/126542050?spm=1001.2014.3001.5502

3. 日志可以输出到统一的目录中

输出到统一的目录中后,日志收集和管理会简单很多。

例如不同的机器可以挂载一个统一的nas盘,把日志都输出到nas盘中,读取日志就变得很简单。
更多文章可以关注 海鸥技术部落公众号

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>嗯,用户正在寻找关于Promtail+Loki+Grafana+Prometheus的技术搭建经验或相关专业人员。从引用材料看,用户显然在搭建云原生监控系统,特别关注多集群部署场景下的日志采集和监控方案。用户提供的引用很有价值,它们详细说明了这些组件的架构集成方式:Promtail负责日志采集,Loki处理日志聚合,Grafana统一展示,而Prometheus则专注于指标监控。 用户可能是个运维工程师或架构师,正在设计企业级监控系统。ta的需求很明确:要实用经验而非理论说明。考虑到实际搭建中的常见痛点,比如多集群配置、标签管理、存储优化等,ta应该需要具体的避坑指南和性能调优建议。 上次对话中用户提到"动态服务发现""避免人工配置"等关键词,说明自动化部署和可扩展性是ta的核心诉求。因此分享经验时要突出:如何用Promtail自动发现容器日志,Loki如何利用Prometheus的标签体系实现无缝关联查询,以及Grafana如何统一展示日志和指标。 用户没有明确说环境是Kubernetes,但从组件选择看肯定是云原生场景。应该补充说明Helm部署技巧和CRD配置要点——虽然用户没直接问,但这在实操中至关重要。另外ta可能低估了存储设计的复杂度,需要强调Loki的chunk存储配置对性能的影响。 准备推荐社区资源时,考虑筛选真正有生产实践案例的教程,避开那些只讲基础配置的表面文章。特别要包括多租户权限控制的内容,这在企业部署时往往是刚需但容易被忽视。 </think>基于您对Promtail+Loki+Grafana+Prometheus(简称PLG+P)搭建经验的需求,结合引用信息和行业实践,整理以下关键经验及资源指引: --- ### **一、实战搭建经验总结** #### **1. 架构设计要点** - **分层采集**(引用[2]) 采用`Promtail`作为日志采集代理,部署在每个节点上实时抓取容器/应用日志,通过`scrape_config`动态发现Pod路径,避免手动配置。 - **中心化聚合**(引用[1][3]) `Loki`接收Promtail日志后,仅索引标签(如`job=nginx, cluster=A`),原始日志以压缩块存储于对象存储(S3/MinIO),显著降低成本(引用[3])。 - **统一可视化** `Grafana`配置Loki为日志源、Prometheus为指标源,实现**单面板关联查询**(如:先查Prometheus异常指标,联动Loki定位日志)。 #### **2. 关键配置技巧** | 组件 | 配置项 | 最佳实践 | |------------|-------------------------|--------------------------------------------------------------------------| | **Promtail** | `scrape_configs` | 使用Kubernetes服务发现自动获取Pod日志路径:<br>```relabel_configs: [source_label: __meta_kubernetes_pod_label_app]``` | | **Loki** | `storage_config` | 对象存储优化:设置`chunk_target_size=1MB`提升查询效率(引用[3]) | | **Prometheus**| 日志/指标关联 | 在Loki中配置`promtail_client_external_labels`添加集群标识(如`cluster=A`) | #### **3. 多集群部署方案**(引用[1]) ```mermaid graph LR subgraph Cluster A A_Promtail --> A_Loki A_Prometheus end subgraph Cluster B B_Promtail --> B_Loki B_Prometheus end A_Loki --> Central_Grafana B_Loki --> Central_Grafana A_Prometheus --> Central_Grafana B_Prometheus --> Central_Grafana ``` > **注意**:每个集群独立部署Loki+Promtail,中心Grafana通过多数据源聚合查询,避免单点故障。 --- ### **二、经验获取渠道** #### **1. 资深社区资源** - **Grafana 官方文档** [Loki部署指南](https://grafana.com/docs/loki/latest/installation/)含Helm/Kustomize模板,涵盖多集群配置示例。 - **GitHub 实战项目** 参考开源项目如`kube-prometheus-stack`,集成Prometheus-Operator与Loki栈:[项目链接](https://github.com/prometheus-operator/kube-prometheus) - **中文技术社区** - **极客时间专栏**:《云原生监控与日志系统实践》详解PLG+P架构 - **知乎专栏**:搜索“Loki多集群日志平台建设”获取国内落地案例 #### **2. 寻找专业人员** | 平台 | 关键词建议 | 优势 | |---------------|-------------------------------|-----------------------------| | **LinkedIn** | “Observability Engineer” +Loki” | 定位外企云原生监控专家 | | **稀土掘金** | “Grafana Loki 实战” | 联系国内大厂日志平台开发者 | | **Grafana社区**| 论坛提问标签`#multi-cluster` | 官方工程师直接解答(英文) | --- ### **三、避坑指南** 1. **标签爆炸问题** **避免**:为日志添加动态标签(如`pod_id`)导致索引膨胀。 **方案**:固定标签仅保留业务维度(服务名、环境),过滤高频变量(引用[3]存储优化)。 2. **Promtail丢失日志** **根因**:节点资源不足时Promtail队列积压。 **解决**:调整`promtail_config: client: batchwait: 1s`(降低等待时间)+ 限制采集速率。 3. **跨集群权限管控** 采用`Grafana Enterprise`的[RBAC](https://grafana.com/docs/grafana/latest/administration/roles-and-permissions/)功能,按集群分配数据源访问权限。 --- > 以上经验源于生产环境部署案例及社区最佳实践[^1][^2][^3]。建议从单集群测试开始,逐步扩展至多集群架构。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值