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

2023-11-30 02:20

本文主要是介绍PLG(Promtail + Loki + Grafana)日志系统生产快速实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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

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: falseserver:http_listen_port: 3100  # http 端口grpc_listen_port: 9096common:path_prefix: /data/lokistorage:filesystem:  # loki 存储位置chunks_directory: /data/loki/chunksrules_directory: /data/loki/rulesreplication_factor: 1ring:instance_addr: 127.0.0.1kvstore:store: inmemoryquery_range:results_cache:cache:embedded_cache:enabled: truemax_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-24store: boltdb-shipperobject_store: filesystemschema: v11index: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: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- 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: RFC3339Nanosource: 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: RFC3339Nanosource: 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.csdn.net/AndCo/article/details/126542050?spm=1001.2014.3001.5502

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

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

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

这篇关于PLG(Promtail + Loki + Grafana)日志系统生产快速实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/435253

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环