grafana loki轻量级日志收集系统

2023-05-19 19:44:02 浏览数 (3)

# Loki 日志系统

# Loki 概述

Grafana Loki

  • Loki的第一个稳定版本于2019年11月19日发布
  • 是 Grafana Labs 团队最新的开源项目
  • 是一个水平可扩展,高可用性,多租户的日志聚合系统

Loki的第一个稳定版本于2019年11月19日发布 是 Grafana Labs 团队最新的开源项目 是一个水平可扩展,高可用性,多租户的日志聚合系统 Loki 特性

  • 不对日志进行全文索引(vs ELK技)
  • 通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本
  • 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,使得日志的扩展和操作效率更高
  • 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引
  • 适合中小团队对日志平台的需求
  • 受 Grafana 原生支持

Loki 组成

  • loki 是主服务器,负责存储日志和处理查询
  • promtail 是代理,负责收集日志并将其发送给 loki
  • Grafana 用于 UI 展示

# 安装 Loki

# 环境说明

演示环境拓扑

  • Loki和grafana服务器:192.168.0.11
  • promtail 日志收集服务器:192.168.0.11,192.168.0.12
  • 使用docker下载并运行镜像
# Loki 主服务器

运行 grafana loki

代码语言:javascript复制
$ docker run -ti -p 3000:3000 grafana/grafana:master
$ docker run -ti -p --name loki 3100:3100 grafana/loki:2.4.1

启动 promtail ,将 promtail 配置文件拷贝到宿主机

代码语言:javascript复制
$ docker run -ti --name promtail grafana/promtail:2.4.1 -config.file=/etc/promtail/config.yml
$ mkdir /data/soft/promtail
$ docker cp promtail:/etc/promtail/config.yml /data/soft/promtail/config.yml

收集 nginx 日志

  • 修改 promtail 配置文件
  • url: 指定 Loki 地址
代码语言:javascript复制
$ vim /data/soft/promtail/config.yml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://192.168.0.11:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: nginxlogs # job 名称
      __path__: /var/log/nginx/*log  # 收集日志路径

挂载 nginx 日志文件目录和 promtail 配置文件到容器

代码语言:javascript复制
$ docker run -ti --name promtail 
-v /var/log/nginx/:/var/log/nginx/ 
-v /data/soft/promtail/config.yml:/etc/promtail/config.yml 
grafana/promtail:2.4.1 -config.file=/etc/promtail/config.yml
# 使用 Loki

访问 grafana 面板

  • 默认用户名和密码是 admin
  • http://192.168.0.11:3000

添加数据源

  • 配置选择 DATA SOURCES
  • 点击 Add data source 添加 Loki

配置 Loki 地址

  • url 填写正确地址
  • 点击 Save & test 测试并保存

使用 Loki

  • 切换到 grafana 左侧区域的 Explore
  • 数据库源选择 Loki
  • 点击 Log browser 选择需要查看的日志

# 查看日志

# Loki 选择器

查询表达式

  • 对于查询表达式的标签部分,将其包装在花括号中{}
  • 使用键值对的语法来选择标签
  • 多个标签表达式用逗号分隔
代码语言:javascript复制
{filename="/var/log/nginx/pcb.access.log",job="nginxlogs"}

匹配运算符

  • = 等于
  • *!= 不相等
  • =~ 正则表达式匹配
  • !~ 不匹配正则表达式 Loki 过滤器 搜索表达式
  • 搜索表达式可以只是文本或正则表达式
  • 表达式接受RE2语法
  • 匹配项区分大小写 过滤器类型
  • |= 行包含字符串。
  • != 行不包含字符串。
  • |~ 行匹配正则表达式。
  • !~ 行与正则表达式不匹配
代码语言:javascript复制
{filename="/var/log/nginx/pcb.access.log",job="nginxlogs"} |~ ""nx_status":200"

# promtail

# 客户端收集日志

将需要收集的日志挂载到 promtail 容器

  • 客户端仅启动 promtail 日志收集容器
  • -v 宿主机日志目录:/var/log/****

promtail 配置说明

  • 支持通配符 *, 表示所有,比如 *.log
  • 多个日志目录可以使用 {path1,path2,…pathN} 区分
  • 不同的 job 使用 targets 区分
代码语言:javascript复制
 - targets:
      - localhost
    labels:
      job: logsname1
      __path__: /var/log/path1/*log

  - targets:
      - localhost
    labels:
      job: logsname2
      __path__: /var/log/path2/*log
# 注意事项

promtail 报 429 错误

  • 收集的日志太多了,超过了 loki 的限制
代码语言:javascript复制
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 限制

代码语言:javascript复制
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

0 人点赞