前言

  • Grafana 提供 Loki 中捕获的日志行的可视化与搜索平台。
  • Loki 是日志记录存储与检索引擎。
  • Promtail 做为日志采集器,从 flog 中抓取日志行,并通过网关将它们推送给 Loki。

Promtail 是运行环境的代理(或客户端),它捕获日志行并通过网关将它们推送到 Loki 集群。在典型环境中,生成日志的应用程序和代理一起运行,但位置与 Loki 集群不同。Grafana 提供了一种对 Loki 中存储的日志进行查询并可视化查询结果的方法。

安装 Loki

简介

Grafana Loki 是一个日志聚合工具,它是功能齐全的日志堆栈的核心。

Loki 是一个为有效保存日志数据而优化的数据存储。日志数据的高效索引将 Loki 与其他日志系统区分开来。与其他日志系统不同,Loki 索引是根据标签构建的,原始日志消息未编入索引。

功能特点

  • 用于索引日志的高效内存使用:通过在一组标签上建立索引,索引可以显着小于其他日志聚合产品。内存越少,操作成本就越低。
  • 多租户:Loki 允许多个租户使用单个 Loki 实例。不同租户的数据与其他租户完全隔离。通过在代理中分配租户 ID 来配置多租户。
  • LogQL,Loki 的查询语言:Prometheus 查询语言 PromQL 的用户会发现 LogQL 熟悉且灵活,可针对日志生成查询。该语言还有助于从日志数据生成指标,这是一个远远超出日志聚合的强大功能。
  • 可扩展性:1、Loki 可以作为单个二进制文件运行;所有组件在一个进程中运行。2、Loki 专为可扩展性而设计,因为 Loki 的每个组件都可以作为微服务运行。配置允许单独扩展微服务,允许灵活的大规模安装。
  • 灵活性:许多代理(客户端)都有插件支持。这允许当前的可观察性结构添加 Loki 作为其日志聚合工具,而无需切换可观察性堆栈的现有部分。
  • Grafana 集成:Loki 与 Grafana 无缝集成,提供完整的可观察性堆栈。

下载

https://github.com/grafana/loki/releases/

获取通用配置

wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml

配置详解

auth_enabled: false  # 是否启用鉴权

server:
  http_listen_port: 3100   #http访问端口
  grpc_listen_port: 9096   #rpc访问端口

common:
  path_prefix: /tmp/loki    #loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks    #记录块存储目录,默认chunks块上的日志数量或到期后,将chunks数据打标签后存储
      rules_directory: /tmp/loki/rules      #规则配置目录
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1   #网络地址
    kvstore:
      store: inmemory

query_range:         #查询规则
  results_cache:     #结果缓存
    cache:
#      embedded_cache:  #默认开启后会有提示,未配置缓存项,暂不开启
#        enabled: true
#        distributed: true
#        max_size_mb: 100

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   #告警通知url

官方文档

https://grafana.com/docs/loki/latest/installation/local/

启动

#命令行
./loki-linux-amd64 --config.file=loki-local-config.yaml

后台运行

nohup ./loki-linux-amd64 --config.file=loki-config.yaml > log.out 2>&1 &

WEB 访问

http://localhost:3100/metrics

LogQL 语法

选择器

对于查询表达式的标签部分,将放在 {} 中,多个标签表达式用逗号分隔:

{app="mysql",name="mysql-backup"}

支持的符号有:

  • =:完全相同。
  • !=:不平等。
  • =~:正则表达式匹配。
  • !~:不要正则表达式匹配。

过滤表达式

编写日志流选择器后,您可以通过编写搜索表达式进一步过滤结果。搜索表达式可以文本或正则表达式。

如:

  • {job=“mysql”} |= “error”
  • {name=“kafka”} |~ “tsdb-ops.*io:2003”
  • {instance=~“kafka-[23]”,name=“kafka”} != kafka.server:type=ReplicaManager

支持多个过滤:

  • {job=“mysql”} |= “error” != “timeout”

目前支持的操作符:

  • |= line 包含字符串。
  • != line 不包含字符串。
  • |~ line 匹配正则表达式。
  • !~ line 与正则表达式不匹配。

安装 Promtail

简介

Promtail 是一个代理,它将本地日志的内容发送到私有 Grafana Loki 实例或 Grafana Cloud。它通常部署到每台需要监控应用程序的机器上。

它主要是:

  • 发现目标
  • 将标签附加到日志流
  • 将它们推送到 Loki 实例。

目前,Promtail 可以跟踪来自两个来源的日志:本地日志文件和 systemd 日志(仅在 AMD64 机器上)。

Promtail 配置有一组目标(即要读取的内容,如文件)并且所有标签都设置正确,它将开始跟踪(连续读取)来自目标的日志。一旦将足够的数据读入内存或在可配置的超时之后,它会作为单个批次刷新到 Loki。

当 Promtail 从源(文件和 systemd 日志,如果已配置)读取数据时,它将跟踪它在位置文件中读取的最后一个偏移量。默认情况下,位置文件存储在 /var/log/positions.yaml. 在 Promtail 实例重新启动的情况下,位置文件可帮助 Promtail 从中断处继续读取。

下载

https://github.com/grafana/loki/releases/

获取通用配置

wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml

配置详解

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml   #用于记录每次读取日志文件的索引行数,如:promtail重启后从该配置中恢复日志文件的读取位置

clients:
  - url: http://localhost:3100/loki/api/v1/push   #推送日志流到Loki中的api

scrape_configs:   #发现日志文件的位置并从中提取标签
- job_name: system   #任务名称
  static_configs:    # 目录配置
  - targets:         # 标签
      - localhost
    labels:
      job: varlogs   #子任务名称,通常以项目命令
      __path__: /var/log/*log   #要读取的日志文件的位置,允许使用通配符/*log或/**/*.log

官方文档

https://grafana.com/docs/loki/latest/installation/local/

启动

#命令行
./promtail-linux-amd64 --config.file=promtail-local-config.yaml

后台运行

nohup ./promtail-linux-amd64 --config.file=promtail-local-config.yaml > log.out 2>&1 &

安装 Granafa

简介

Grafana (格拉法纳)是一个开源的,拥有丰富 dashboard 和图表编辑的指标分析平台,和 Kibana 不同的是 Grafana 专注于时序类图表分析,而且支持多种数据源,如 InfluxDB、Elasticsearch、Mysql、K8s、Redis、Zabbix、ClickHouse 等等。

官网

https://grafana.com

下载

https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1&platform=windows

下载后将 zip 文件压缩包解压到任意路径;(本示例Grafana以已安装的window版为主,如需linux版本,安装一样,解压即可用)

配置

默认 Grafana 用 3000 做为访问端口,如需修改,进入到 conf 目录下,打开 defaults.ini 文件,找到 server 选项,按规则配置即可。

启动

windows 模式进入 bin 目录双击运行 “grafana-server.exe”

linux 环境:

进入 bin 目录运行 “./grafana-server”

后台运行“nohup ./grafana-server > /tmp/null 2>&1 &”

访问:http://127.0.0.1:3000

默认用户名和密码:admin/admin

共享仪表盘

官方有很多共享的仪表盘资源可下载,从而减少自已不熟悉仪表盘的配置与脚本从而无法操作出想要的效果,通过获得第三方共享资源可以快速进行展示。

https://grafana.com/grafana/dashboards/

官方文档

https://grafana.com/docs/grafana/latest/whatsnew/

日志输出

通过 IDEA 创建一个示例项目(如想快速体验,可以直接用新的 Tomcat 的服务日志做演示),本项目为一个普通 SpringBoot,启动应用后,以默认配置日志格式,将日志输出到指定目录。

日志生成与存储位置,通过在 promtail 的 config 配置 /*.log 配置符,加载此日志文件,并跟踪日志文件变化,如有新记录则从上次记录位置追加提取

安装 Loki 插件

从 Plugins 菜单中进入,直接搜索 loki, 点击进入创建界面

点击 “Create aLoki data source” 进入配置页

在配置页中 URL 中添加 Loki 的服务地址与端口,其它默认配置,直接点击 “Save & test” 测试保存即生成了 DataSource,在 DashBoards 中可以使用该 DataSource

日志演示

从左侧菜单》Explore 进入

左上角 DataSource 选择 Loki

查找日志内容

在 Log browser > 输入:

# fliename为加载指定日志文件,|~`1388` 表示查找包含1388的内容
{filename="D:\\Workspaces\\idea_3\\mqmiddle\\logs\\api.log"}|~ `1388`
#或,varlogs为pormtail配置文件中的job值,|= ``表示查询所有
{job=~"varlogs"} |= ``

界页返回匹配到的日志检索记录

如果对上述查询命令使用不熟,Grafana 可以多条件组合搜索日志,命令最终也是转换成组合条件后匹配日志

错误

1. 启动失败,提示未找 cache 缓存相关配置项;

./loki-linux-amd64 --config.file=loki-local-config.yaml
failed parsing config: loki-local-config.yaml: yaml: unmarshal er
line 22: field embedded_cache not found in type cache.Config

打开 loki-local-conf.yaml 配置,注释掉 22 行 embedded_cache 配置与子项,缺少 cache 缓存配置项(如:memory,redis,memcached),暂不启用即可。

2.promtail 报 429 错误,收集的日志太多了,超过了 loki 的限制。

level=warn ts=2022-08-17T08:57:18.392566996Z caller=client.go:369 component=client host=127.0.0.1:3100 msg="error sending batch, will retry" status=429 error="server returned HTTP status 429 Too Many Requests (429): entry with timestamp 2022-08-17 08:57:18.337985682 +0000 UTC ignored, reason: 'Per stream rate limit exceeded (limit: 3MB/sec) while attempting to ingest for stream '{filename=\"/data/log/info.log\", job=\"web-log\"}' totaling 128B, consider splitting a stream via additional labels or contact your Loki administrator to see if the limit can be increased' for stream: {filename=\"/data/log/info4j2.log\", job=\"web-log\"},"
# 增加 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

参考

https://blog.csdn.net/mahj125/article/details/121146795

https://blog.csdn.net/tcy1429920627/article/details/109679363

https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/119791802

https://blog.csdn.net/weixin_49366475/article/details/110524477

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐