Linux搭建Promtail + Loki + Grafana 轻量日志监控系统

一、简介

日志监控告警系统,较为主流的是ELK(Elasticsearch 、 Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦难。很多功能往往用不上,大多数查询只关注一定时间范围和一些简单的参数(如host、service等),使用这些解决方案就有点杀鸡用牛刀的感觉了。

所以寻找更轻量级的日志监控系统,所以也就有了EFK(elasticsearch+kibana+filebeat),

搭建参考:EFK轻量级日志系统搭建

另外一种是Promtail + Loki + Grafana核心组件构成,简称PLG,这种是更轻量级的,配置要求也不高,功能简单,但是目的明确,就是日志采集。

Loki的架构也非常简单,使用了和prometheus一样的标签来作为索引,Loki 是受Prometheus启发的水平可扩展、高可用、多租户日志聚合系统。

组件:
promtail: 日志收集的代理,安装部署在需要收集和分析日志的服务器,promtail会将日志发给Loki服务。
Loki: 主服务器,负责存储日志和处理查询。
Grafana:提供web管理界面,数据展示功能。

二、服务器安装及配置

1.基础安装启动

安装方式大概有这么几种,二进制安装,yum安装、docker安装、helm安装。
因为是服务器端,我这里用docker安装,简单方便。

官方网站也提供了docker-compose文件供下载。
参考地址

#下载docker-compose文件
wget https://raw.githubusercontent.com/grafana/loki/v2.5.0/production/docker-compose.yaml -O docker-compose.yaml

下载的docker-compose文件如下,也是最简单基本的。

version: "3"networks:loki:services:loki:image: grafana/loki:2.5.0ports:- "3100:3100"command: -config.file=/etc/loki/local-config.yamlnetworks:- lokipromtail:image: grafana/promtail:2.5.0volumes:- /var/log:/var/logcommand: -config.file=/etc/promtail/config.ymlnetworks:- lokigrafana:image: grafana/grafana:latestports:- "3000:3000"networks:- loki

这时也可以正常启动即可,默认日志为/var/log的位置。

docker-compose -f docker-compose.yaml up

这时,基本的安装就完成了,但是有时候需要更改配置文件,如后续nginx反向代理访问,这时这个配置文件满足不了需求,所以需要自己改动grafana。还有就是docker-compose down掉,数据也是没了,需要重新添加。

2、升级配置启动

更改也很简单,无非就是启动后,把docker的配置文件夹拷贝出来本地,然后挂载上去即可。

以下就是我自己改的docker-compose文件,可以参考:

本人机器3000端口被占用,所以改用3030端口映射,按需设置。还有本人数据文件夹/var/lib/grafana/挂载后,账号进不去,所以先注释掉了,后续在慢慢测试。

version: "3"networks:loki:services:loki:image: grafana/loki:2.5.0restart: unless-stoppedports:- "3100:3100"volumes:- ./config/loki/:/etc/loki/command: -config.file=/etc/loki/local-config.yamlnetworks:- lokipromtail:image: grafana/promtail:2.5.0volumes:- /var/log:/var/log- ./config/promtail/:/etc/promtail/command: -config.file=/etc/promtail/config.ymlnetworks:- lokigrafana:image: grafana/grafana-enterprise:8.5.2-ubunturestart: unless-stoppedports:- "3030:3000"volumes:- ./config/grafana/:/etc/grafana/
#      - ./grafana-data:/var/lib/grafana/
#这行是数据挂载在本地,需要将数据拷贝出来networks:- loki

最后文件结构如下:除了grafana配置文件夹比较多文件,其他都只有一个。grafana我整个文件夹复制出来就行了。

├── config
│   ├── grafana
│   │   ├── grafana.ini
│   │   ├── ldap.toml
│   │   └── provisioning
│   │       ├── access-control
│   │       ├── dashboards
│   │       ├── datasources
│   │       ├── notifiers
│   │       └── plugins
│   ├── loki
│   │   └── local-config.yaml
│   └── promtail
│       └── config.yml
├── docker-compose.yaml
└── grafana-data├── alerting [error opening dir]├── csv [error opening dir]├── grafana.db├── plugins└── png [error opening dir]

loki的local-config.yaml参考配置文件:

auth_enabled: falseserver:http_listen_port: 3100common:path_prefix: /lokistorage:filesystem:chunks_directory: /loki/chunksrules_directory: /loki/rulesreplication_factor: 1ring:kvstore:store: inmemoryschema_config:configs:- from: 2020-10-24store: boltdb-shipperobject_store: filesystemschema: v11index:prefix: index_period: 24hruler:alertmanager_url: http://localhost:9093# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
#  reporting_enabled: false

promtail的config.yml配置文件:

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://loki:3100/loki/api/v1/pushscrape_configs:
- job_name: systemstatic_configs:- targets:- localhostlabels:job: varlogs__path__: /var/log/*log

grafana的配置文件太长,就不复制了,自己拷贝出来即可。
拷贝完配置文件夹后,更改完后,直接启动即可。

sudo docker-compose up -d

浏览器输入ip端口即可访问,我这里配置为ip:3030端口访问。
在这里插入图片描述

3.grafana的反向代理nginx配置,域名访问

grafana配置完后,默认是IP:端口的方式访问,如果需要域名访问,则需要用到nginx方向代理。

官方文档配置参考:官网地址

需要更改的配置文件为grafana.ini,去掉下面三个前面的注释。

  • domain:你的域名,我这里为grafana.ywbj.cc
  • root_url:访问连接,官方文档是后面加了grafana/,默认是没有的,也可以不加,区别是,不加直接访问网址即可,加了就需要访问域名/grafana才能访问,如:grafana.ywbj.cc/grafana/ 才能访问。我这里配置就没有加。
  • serve_from_sub_path:去掉注释,将false改成true即可。
[server]
domain = grafana.ywbj.cc
root_url = %(protocol)s://%(domain)s:%(http_port)s/
serve_from_sub_path = true

grafana配置完成,下面就是配置nginx了。官方nginx配置文件:
注:如果上面root_url 后面加了grafana/,则location / 改为location /grafana/

# this is required to proxy Grafana Live WebSocket connections.
map $http_upgrade $connection_upgrade {default upgrade;'' close;
}server {listen 80;server_name  grafana.initcapp.com;root /usr/share/nginx/html;index index.html index.htm;location / {proxy_set_header Host $http_host;proxy_pass http://localhost:3000/;}# Proxy Grafana Live WebSocket connections.location /api/live {rewrite  ^/(.*)  /$1 break;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://localhost:3000/;}
}

上面配置好了,然后启动,虽然可以访问,也可以添加资源,但是在实时查看日志流,会出现错误。
Query error Live tailing was stopped due to following error: undefined,如下图:
在这里插入图片描述
原因是websocket出错,即配置文件中location /api/live 这个区域。
根据另一篇官方文档:https://grafana.com/docs/grafana/latest/live/configure-grafana-live/
修改nginx配置文件,最后nginx配置文件为:

map $http_upgrade $connection_upgrade {default upgrade;'' close;
}server {listen 80;server_name  	grafana.ywbj.cc;#root /usr/share/nginx/html;#index index.html index.htm;error_log  /var/log/nginx/nginx.localhost.error.log  warn;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://localhost:3030/;#默认为3000端口,我配置为3030,所以是3030.}

这样启动后,功能一切正常了。

三、客户端安装及配置

loki客户端,及需要收集日志的另一台机器,只需要安装promtail,也可以docker启动安装,也可以二进制安装。

由于本人收集日志有其他目录,如果用docker,需要配置挂载很多路径到docker,所以我在客户端直接用二进制启动即可,配置文件比较容易。

二进制官方下载地址:https://github.com/grafana/loki/releases
找到自己合适的版本promtail,我这里是这个。
在这里插入图片描述
下载后,解压即可,得到一个可执行文件promtail-linux-amd64。

root@web:/loki# ls
config.yaml  promtail-linux-amd64

还需要创建一个config.yaml文件,用于启动promtail

sudo vim config.yaml

如果有多路径及目录,则添加多个job_name即可。
注意:clients中的url为你服务器的地址。

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://192.168.152.100:3100/loki/api/v1/push#服务器端loki的IP地址scrape_configs:
- job_name: webstatic_configs:- targets:- localhostlabels:job: web-varlogs__path__: /var/log/*log- job_name: webstatic_configs:- targets:- localhostlabels:job: nginx-logs__path__: /home/ubuntu/laradock/logs/nginx/*log- job_name: webstatic_configs:- targets:- localhostlabels:job: api-logs__path__: /home/ubuntu/api/storage/logs/*log

创建完配置文件,启动即可。

./promtail-linux-amd64 -config.file=./config.yaml

后台启动,并输入日志。

#输入日志到指定位置
nohup ./promtail-linux-amd64 -config.file=./config.yaml  > /var/log/promtail.log 2>&1 &
#不需要日志输入,直接为空。
nohup ./promtail-linux-amd64 -config.file=./config.yaml  > /dev/null 2>&1 &

启动后,用ps可查看进程是否启动

root@web:/loki# ps -ef|grep promtail
root     1466400 1450430  7 10:41 pts/0    00:00:00 ./promtail-linux-amd64 -config.file=./config.yaml
root     1466415 1450430  0 10:41 pts/0    00:00:00 grep --color=auto promtail

四、grafana使用添加loki

在浏览器输入域名访问,默认账号密码为admin/admin

然后在data sources,点击添加add data source,选择loki即可。
在这里插入图片描述
然后添加服务器loki的地址即可,地址为IP:3100,loki的默认端口为3100。
在这里插入图片描述
添加完成,没有报错,说明添加成功。
explore,在 log browser中选择,即可查看刚才添加的日志,这里以job分类。
在这里插入图片描述
选择一个,show logs即可查看,右上角为实时流查看日志。
在这里插入图片描述
这里loki、promtail、Grafana日志系统就配置完了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python合并多个文件为一个文本文件的方法代码

用Python合并多个文件为一个文本文件的方法代码 Python文件处理操作方便快捷,本文为大家提供的是如何用Python合并多个文本文件的代码示例。要把多个txt或是其它类型文件合并成一个,手动操作费时费力,不如自己动手写一个python代码来完成&…

UE4/5C++多线程插件制作(十六、Coroutines协程封装)

目录 准备 MTPCoroutines.h MTPCoroutines.cpp 我们要对协程继续封装制作: 协程是一种计算机程序组件,它允许在某个位置暂停执行,然后在稍后的时间点恢复执行。与传统的函数调用不同,协程可以被多次调用并且能够保留其内部状态,从而允许程序在执行到一定点时暂停,执行…

java中判断list是否为空

java中判断list是否为空是日常代码中经常遇到的问题。最近发现一个Utils提供的方法可以一步判断。 废话不多说&#xff0c;直接上代码&#xff01; ArrayList<String> arrayList new ArrayList<>(); System.out.println("集合1&#xff1a;" Collecti…

关于Android系统休眠跟串口读写的联系

问题描述&#xff1a;设备在进行rtk定位时&#xff0c;模块会通过串口同时进行读写操作。串口在读写时&#xff0c;如果息屏系统就会进入休眠&#xff0c;休眠的话CPU进入kill cpu状态。但是此时串口还在读写&#xff0c;这就导致出现一个意料外的问题&#xff0c;息屏只十几秒…

2-vi和vim的使用

vi和vim的区别 vi 是linux系统中内置的文本编辑器vim具有程序编辑能力 vi和vim常用的三种模式 正常模式 使用vim打开一个文件&#xff0c;就默认进入正常模式可以使用方向键【上下左右】来移动光标可以使用【删除字符/删除整行】来处理文件内容也可以使用【复制/粘贴】快捷键…

php 年月日 分组分页

//年月日 //分组 分页$type $this->request->type;$dateType "%Y-%m";//月$dateType1 "CONCAT(tmp.date,-01 00:00:00)";$dateType2 "CONCAT(LAST_DAY(CONCAT(tmp.date, -15)), 23:59:59)";if ($type day) {//日$dateType "%Y-…

Pytorch个人学习记录总结 03

目录 Transeforms的使用 常见的transforms Transeforms的使用 torchvision中的transeforms&#xff0c;主要是对图像进行变换&#xff08;预处理&#xff09;。from torchvision import transforms transeforms中常用的就是以下几种方法&#xff1a;&#xff08;Alt7可唤出…

小程序商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

pb:数据类型检查和转换函数

数据类型检查和转换函数 1、Asc() 功 能:得到字符串第一个字符的ASCII码整数值。 语 法:Asc ( string ) 参 数:string:要得到第一个字符ASCII值的字符串。 返回值:Integer。函数执行成功时返回string参数第一个字符的ASCII值,如果string参数的值为NULL,则Asc()函…

解决 The ‘more_itertools‘ package is required

在使用爬虫获取维基百科数据时看到了一个很好的项目&#xff1a; 博客&#xff1a;https://blog.51cto.com/u_15919249/5962100 项目地址&#xff1a;https://github.com/wjn1996/scrapy_for_zh_wiki 但在使用过程中遇到若干问题&#xff0c;记录一下&#xff1a; The ‘more_…

SpringBoot整合第三方 Druid、MybatisPlus、Mybatis

整合第三方技术 整合JUnit Respostory 注解&#xff1a;数据类 1、导入测试对应的starter 2、测试类使用 SpringBootTest 修饰 3、使用自动装配的形式添加要测试的对象 classes的属性 其实主要找的是SpringBootApplication中的SpringBootConfiguration这个注解。也就是配置…

python中去除字符串中指定的字符

去除字符串中特定字符&#xff08;但是只能删除头、尾指定字符&#xff09;&#xff1a; a 你好\n我是xx。\n\n\n print(a.strip(\n))# 你好 # 我是xx。 去除中间字符&#xff0c;可使用replace()函数&#xff1a; a 你好\n我是xx。\n\n\n print(a.replace(\n, ))# 你好我…

215.数组中的第K个最大元素-C++

题目来源&#xff1a;力扣 题目描述&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法…

【微信小程序】通过监听 WebSocket 的状态变化来判断Socket是否已经建立连接

在微信小程序中&#xff0c;可以通过监听 WebSocket 的状态变化来判断是否已经建立连接。具体的操作步骤如下&#xff1a; 创建 WebSocket 对象并进行连接&#xff1a; var socket null; function connectWebSocket() {socket wx.connectSocket({url: wss://your-socket-ur…

VScode中python的相对路径与绝对路径 FileNotFoundError: [Errno 2] No such file or directory

VScode中&#xff0c;python里的相对路径是相对于当前工作目录来定位的&#xff0c;而当前的工作目录在VScode中下方的终端窗口会有提示&#xff1a; 说明此时的工作目录并非当前python文件所在的目录&#xff0c;而是C:\Users\xxxxx(你的用户名)。因此&#xff0c;使用VScode…

CSS自学框架之表格和项目列表

表格和项目列表很直观的显示数据&#xff0c;是我们web开发中经常遇到的最简单表现信息形式。具体代码如下&#xff1a; 一、css代码 ul,ol{margin-left: 1.25em;} /* - 表格 */.myth-table{width: 100%;overflow-x: auto;overflow-y: hidden;border-radius: var(--radius);…

【BOOST程序库】正则表达式相关操作

基本概念这里不解释了&#xff0c;代码中详细解释了BOOST程序库中对于正则表达式常用方法的详细用法。 #include <iostream> #include <string>//正则表达式头文件 #include <boost/xpressive/xpressive.hpp>int main() {//声明正则&#xff1a;boost::pres…

IP隧道技术原理

简介 IP隧道技术是一种将一个协议的数据包封装在另一个协议的数据包中进行传输的技术。在网络通信中&#xff0c;不同的网络协议之间可能存在不兼容的情况&#xff0c;这时候就需要使用IP隧道技术来解决这个问题。 原理 IP隧道技术的原理是将一个协议的数据包封装在另一个协议…

TypeScript中Class Interface Type的定义和区别

TypeScript中的Class、Interface和Type是用来定义数据类型的工具。它们的使用情境和作用有些不同。 目录 Class&#xff08;类&#xff09; Interface&#xff08;接口&#xff09; Type&#xff08;类型&#xff09; 总结 Class&#xff08;类&#xff09; 类可以用于创…

【压测指南|压力测试核心性能指标及行业标准】

文章目录 压力测试核心性能指标及行业标准指标1&#xff1a;响应时间指标2&#xff1a;吞吐量&#xff08;TPS)指标3&#xff1a;失败率总结&#xff1a; 压力测试核心性能指标及行业标准 在做压力测试时&#xff0c;新手测试人员常常在看报告时倍感压力&#xff1a;这么多性能…