参考文献https://blog.csdn.net/weixin_52270081/article/details/124801308
介绍
日志监控告警系统,较为主流的是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管理界面,数据展示功能。
docker-compose基础文件
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.5.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.5.0
volumes:
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
networks:
- loki
执行:docker-compose up --build
目的是尝试运行,确保能够正常拉取镜像,并通过运行好的容器,获取相关的配置文件
通过 :
docker cp eb5c3c8c3f5b:/var/lib/grafana/grafana.db /home/Promtail_Loki_Grafana/
docker cp 容器ID:/容器内路径/** /宿主机路径/**
复制容器内文件到宿主机中自定义的目录中(参考以下配置)
docker-compose正式文件
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.6.0
ports:
- "3100:3100"
volumes:
- ./config/loki/:/etc/loki/
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.6.0
volumes:
- /var/log:/var/log
- ./config/promtail/:/etc/promtail/
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- ./config/grafana/:/etc/grafana/
#- ./grafana-data:/var/lib/grafana/ #不注释会导致grafana无法登录
networks:
- loki
通过 docker-compose up --build 命令启动
local-config.yaml 配置文件参考
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://192.168.6.129:9093
promtail/config.yml配置文件参考
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.6.129:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log
客户端安装以及配置
只需要安装promtail,也可以docker启动安装,也可以二进制安装。
现在通过二进制安装
二进制官方下载地址:https://github.com/grafana/loki/releases
下载完成后,安装到你要上报日志的服务器中
通过unzip命令解压出一个可执行文件
这里要创建一个config.yml文件
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.6.129:3100/loki/api/v1/push #上报到指定的loki日志分析处理服务
scrape_configs:
- job_name: 136system
static_configs:
- targets:
- localhost
labels:
job: 136system #在grafana中显示的job分类名称
__path__: /var/log/*log #要监听上报的日志文件
- job_name: 136device
static_configs:
- targets:
- localhost
labels:
job: 136device
__path__: /home/giacp/log/device-service/*log
- job_name: 136business
static_configs:
- targets:
- localhost
labels:
job: 136business
__path__: /home/giacp/log/business-service/*log
启动
./promtail-linux-amd64 -config.file=./config.yaml
后台启动
#输入日志到指定位置
nohup ./promtail-linux-amd64 -config.file=./config.yml > /var/log/promtail.log 2>&1 &
#不需要日志输入,直接为空。
nohup ./promtail-linux-amd64 -config.file=./config.yml > /dev/null 2>&1 &
grafana
添加数据源
这里是填写loki所在的服务ip以及loki端口
查看日志
Loki 选择器
查询表达式
对于查询表达式的标签部分,将其包装在花括号中{}
使用键值对的语法来选择标签
多个标签表达式用逗号分隔
{filename=“/var/log/nginx/pcb.access.log”,job=“nginxlogs”}
匹配运算符
= 等于
!= 不相等
=~ 正则表达式匹配
!~ 不匹配正则表达式
Loki 过滤器
搜索表达式
搜索表达式可以只是文本或正则表达式
表达式接受RE2语法
匹配项区分大小写
过滤器类型
|= 行包含字符串。
!= 行不包含字符串。
|~ 行匹配正则表达式。
!~ 行与正则表达式不匹配
通过关键字过滤
{job="136business"}|~ "Parameters"
注意事项
promtail 报 429 错误
收集的日志太多了,超过了 loki 的限制
level=warn ts=2021-12-02T06:27:01.372586524Z caller=client.go:349 component=client host=192.168.0.11:3100 msg="error sending batch, will retry" status=429 error="server returned HTTP status 429 Too Many Requests (429): entry with timestamp 2021-12-02 06:27:01.316127865 +0000 UTC ignored, reason: 'Per stream rate limit exceeded (limit: 3MB/sec) while attempting to ingest for stream '{filename=\"/var/log/nginx/nginx.log\", job=\"nginxlogs\"}' totaling 1697740B, consider splitting a stream via additional labels or contact your Loki administrator to see if the limt can be increased' for stream: {filename=\"/var/log/nginx/nginx.log\", job=\"nginxlogs\"},"
增加 Loki 限制
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
ingestion_rate_mb: 40
ingestion_burst_size_mb: 20