轻量级日志解决方案---loki
2024-11-19 18:10 luoguoling 阅读(130) 评论(0) 收藏 举报日志解决方案--LOKI
架构实现方案
微服务日志---->promtail--->loki<-----grafana
flowchart LR;
微服务日志-->promtail;
promtail-->loki;
grafana --> loki;
LOKI优势
名称 | 安装组件 | 特性 | 优点 |
---|---|---|---|
loki | grafana,loki,protail | 不对全文索引,压缩非结构化和仅索引元数据,使用标签记录流对日志进行索引和分组 | 占用资源小,grafana原生支持,查询速度快 |
安装与配置
Loki安装
mkdir -p /opt/plg/loki && cd /opt/plg/loki
curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.6/loki-linux-amd64.zip" # 请根据实际需求替换版本号
unzip "loki-linux-amd64.zip"
chmod a+x "loki-linux-amd64"
promtail安装
mkdir -p /opt/plg/promtail && cd /opt/plg/promtail
curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.6/promtail-linux-amd64.zip" # 请确保与Loki版本匹配
unzip "promtail-linux-amd64.zip"
chmod a+x "promtail-linux-amd64"
#日志目录需要设置权限:
setfacl -R -m u:promtail:rx /var/log/nginx/
grafana安装配置
wget https://dl.grafana.com/oss/release/grafana-10.2.0-1.x86_64.rpm
yum install grafana-10.2.0-1.x86_64.rpm
配置文件下载
cd /usr/local/loki # 如果Loki安装在其他位置,请切换到相应目录
wget https://raw.githubusercontent.com/grafana/loki/v2.8.6/cmd/loki/loki-local-config.yaml # 同样根据实际版本替换
cd /usr/local/loki # 切换到Promtail目录
wget https://raw.githubusercontent.com/grafana/loki/v2.8.6/clients/cmd/promtail/promtail-local-config.yaml
loki配置文件
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
grpc_server_max_recv_msg_size: 104857600 #限制大小100M
grpc_server_max_send_msg_size: 104857600 #限制大小100M
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
#boltdb:
# directory: /tmp/loki/index
filesystem: #存储位置
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
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的倍数
querier:
query_timeout: 3m
promtail配置文件
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: servicelog
__path__: /var/log/tima/*log
- targets:
- localhost
labels:
job: syslog
__path__: /var/log/message
#多行合并解决办法
pipeline_stages:
- multiline:
firstline: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
- regex:
expression: '^(?P<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) (?P<level>INFO|WARN|ERROR) (?P<message>.*)$'
- labels:
level:
- timestamp:
format: '2006-01-02 15:04:05.000'
source: time
启动脚本
nohup /usr/local/loki/loki-linux-amd64 -config.file=/usr/local/loki/loki-local-config.yaml >loki.out 2>&1 &
nohup /usr/local/loki/promtail-linux-amd64 -config.file=/usr/local/loki/promtail-local-config.yaml >promtail.out 2>&1 &
systemctl start grafana-server
LogQL语法
语法参考文档:https://grafana.com/docs/loki/latest/query/
#支持符号
= :完全相同。
!= :不平等。
=~ :正则表达式匹配。
!~ :不要正则表达式匹配
# 搜索表达式
|= line 包含字符串。
!= line 不包含字符串。
|~ line 匹配正则表达式。
!~ line 与正则表达式不匹配。
配置grafana
配置loki数据源
导入grafana模板
https://grafana.com/grafana/dashboards/13639-logs-app/
测试环境
性能验证:
测试指标: 4核16G 每日日志量: 70GB 测试条件:40Gb日志全量查询最近2天
性能指标 | 初始值 | loki启动 | 查询 |
---|---|---|---|
cpu | 1.73% | 3.3% | 5.5% |
内存 | 41% | 44% | 46% |
扩展: 链路监控(tempo) 告警实现
参考 :
https://blog.csdn.net/weixin_49124386/article/details/134188206
https://blog.51cto.com/u_16213716/12513261
https://blog.51cto.com/deva008/10026526 k8s部署