目录
Loki介绍
项目地址
项目地址:https://github.sheincorp.cn/grafana/loki
基于 Loki 的日志记录堆栈由 3 个组件组成:
promtail
是代理,负责收集日志并将其发送给 Loki。loki
是主服务器,负责存储日志和处理查询。- Grafana用于查询和显示日志。
Loki安装
tips:首次使用建议使用Docker Compose快速搭建,体验一下看看是否适合自身的需求,再可以尝试本地安装
1、快速部署(docker-cmopose)
如果您想试验 Loki,可以使用 Loki 附带的 Docker Compose 文件在本地运行 Loki。它以整体部署模式运行 Loki ,并包含一个用于生成日志的示例应用程序。
Docker Compose 配置实例化以下组件,每个组件都在自己的容器中:
- flog一个生成日志行的示例应用程序。flog是常见日志格式的日志生成器。
- Grafana Alloy从 flog 上刮下原木线,并通过网关将它们推给 Loki。
- 网关(NGINX),接收请求并根据请求的 URL 将它们重定向到适当的容器。
- 一个 Loki读取组件(查询前端、查询器)。
- 一个 Loki写入组件(Distributor、Ingester)。
- 一个 Loki后端组件(Index Gateway、Compactor、Ruler、Bloom Compactor(实验)、Bloom Gateway(实验))。
- Minio 是一个与 S3 兼容的对象存储,Loki 使用它来存储其索引和块。
- Grafana提供 Loki 中捕获的日志行的可视化。
整体架构如下:
部署命令,需要提前安装docker跟docker- compose环境
mkdir evaluate-loki cd evaluate-loki # 下载配置文件&docker-compose.yaml wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml -O loki-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/alloy-local-config.yaml -O alloy-local-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml # 启动docker-compose.yaml docker compose up -d |
后续使用教程,可以参考官方文档:Quickstart to run Loki locally | Grafana Loki documentation
2、本地安装
1、安装流程
为了运行 Loki,您必须:
- 下载并安装 Loki 和 Promtail。
- 下载两个程序的配置文件。
- 启动Loki。
- 更新 Promtail 配置文件以将日志记录到 Loki 中。
- 启动 Promtail。
2、安装步骤
下载地址:https://github.sheincorp.cn/grafana/loki/releases/
推荐下砸releases3.0版本
mac M系列芯片,下载带darwin-arm64标签的文件
mac M1下载命令demo
# 下载mac M芯片对应的版本文件 wget https://github.sheincorp.cn/grafana/loki/releases/download/v3.0.0/loki-darwin-amd64.zip wget https://github.sheincorp.cn/grafana/loki/releases/download/v3.0.0/promtail-darwin-arm64.zip # 解压zip压缩包 unzip loki-darwin-amd64.zip unzip promtail-darwin-arm64.zip # 下载配置文件 wget https://raw.githubusercontent.com/grafana/loki/main/cmd/loki/loki-local-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml |
Linux系统,下载带linux标签的文件
可以用uanme命令查看自己的操作系统信息
uname -a
Linux centos7*64下载命令demo
# 下载命令 wget https://github.sheincorp.cn/grafana/loki/releases/download/v3.0.0/loki-linux-arm64.zip wget https://github.sheincorp.cn/grafana/loki/releases/download/v3.0.0/promtail-darwin-arm64.zip # 解压命令 unzip loki-linux-arm64.zip unzip promtail-darwin-arm64.zip # 下载配置文件 wget https://raw.githubusercontent.com/grafana/loki/main/cmd/loki/loki-local-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml |
3、配置文件解析
loki-local-config.yaml
auth_enabled: false 这个配置项表示不启用身份验证。默认情况下,Loki 不要求客户端提供身份验证信息。 server 这部分配置定义了 Loki 的监听端口: http_listen_port: 3100 Loki 的 HTTP API 监听端口设为 3100,这是默认值,客户端(如 Promtail、Grafana等)将通过这个端口发送和查询日志数据。 grpc_listen_port: 9096 gRPC 监听端口设为9096,Loki 使用 gRPC 进行内部通信,比如查询前端和查询调度器之间。 common common 部分包含了一些共通配置: instance_addr: 127.0.0.1 指定了实例的地址。 path_prefix: /tmp/loki 指定了 Loki 存储数据的根目录路径。 storage 部分定义了 Loki 的存储方式;在这个配置中,它使用的是本地文件系统存储方式。 chunks_directory 和 rules_directory 分别指定了存储数据块和规则文件的目录。 replication_factor: 1 replication_factor 设置了数据副本的数量。在这种单实例配置下,副本因子被设置为1,意味着不额外创建数据的副本。 ring 这部分配置与 Loki 的分布式架构相关。即使在单节点配置中也需要这些设置。 kvstore 设置了 Loki 组件之间如何共享环(ring)的状态信息;这里使用内存存储(inmemory),适用于单机部署。 query_range 这部分配置定义了 Loki 如何处理范围查询的结果缓存: results_cache 通过启用 embedded_cache 和设置其最大容量为100MB来提升查询性能。 schema_config 这部分配置定义了 Loki 如何存储日志数据。这里配置的是从 2020-10-24 开始,使用的是 v13 版本的存储方案,意味着使用时间序列数据库(TSDB)格式存储日志数据。 ruler ruler 配置与 Loki 的警报规则处理相关: alertmanager_url 设置了用于警报消息的 Alertmanager 服务的URL。 frontend 定义了 Loki 前端的配置。 encoding 设置为 protobuf,表示使用 Protocol Buffers 格式进行数据编码。 analytics 最后部分是关于向 Grafana Labs 发送匿名统计信息的设置。这有助于 Grafana Labs 改进 Loki,但如果不希望发送统计信息,可以通过取消注释并设置 reporting_enabled: false 来禁用。 这份配置主要是为了运行 Loki 的单节点实例进行本地测试或开发使用,不涉及高可用性和数据冗余的设置。在生产环境中部署 Loki 时,会需要做出相应的调整,特别是考虑到数据持久性、安全性(启用 auth_enabled)、以及高可用性配置(如使用外部存储、多节点部署等)。 |
promtail-local-config.yaml
Server 配置 yaml server: http_listen_port: 9080 grpc_listen_port: 0 这部分配置定义了 Promtail 服务的监听端口: http_listen_port: 9080 表示 Promtail 的 HTTP 服务监听在 9080 端口,你可以通过这个端口访问 Promtail 的 web 接口。 grpc_listen_port: 0 禁用了 gRPC 监听,因为这里设置的是 0。Promtail 使用 gRPC 进行一些内部通信,如果不需要,可以禁用。 Positions 配置 yaml positions: filename: /tmp/positions.yaml Promtail 跟踪每个日志文件的读取位置,以确保即使在重启后也能从上次停止的位置继续读取。positions 配置定义了存储这些位置信息的文件路径。 Clients 配置 yaml clients: - url: http://loki:3100/loki/api/v1/push 这部分配置定义了 Promtail 将日志发送到的 Loki 实例或集群。在这个示例中,它被配置为将日志发送到 http://loki:3100/loki/api/v1/push 地址,这是 Loki 接收日志数据的 API 端点。 Scrape Configs 配置 yaml scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*log scrape_configs 配置定义了 Promtail 如何发现并抓取日志文件: job_name: system 定义了这个抓取配置的名字,用于标识来自该配置的日志数据。 static_configs 定义了一组静态目标和标签。在这个示例中,它指定了一个目标(localhost),但实际上没有用网络地址来抓取日志,而是通过 __path__ 标签本地读取文件。 __path__: /var/log/*log 这个特殊标签告诉 Promtail 去哪里找日志文件。在这个例子中,它被设置为读取 /var/log 目录下所有以 log 结尾的文件。 labels 中的 job: varlogs 是一个自定义标签,会被附加到从这些文件中收集的所有日志上,以便于在 Loki 中查询和管理。 这个配置构建了一个基本的 Promtail 安装,用于抓取本地 /var/log 目录下的所有日志文件并将它们发送到一个 Loki 实例进行存储和查询。你可以根据自己的需要调整这个配置,比如改变日志来源或 Loki 服务器的 URL。 |
4、启动Loki命令
mac
./loki-darwin-amd64 -config.file=loki-local-config.yaml ./promtail-darwin-arm64 -config.file=promtail-local-config.yaml |
Linux
./loki-linux-amd64 -config.file=loki-local-config.yaml ./promtail-linux-amd64 -config.file=promtail-local-config.yaml |
启动成功后,访问http://localhost:3100/ready查看是否启动成功
3、docker方式安装
Docker方式安装
# 创建文件夹 mkdir loki cd loki # 下载配置文件 wget https://raw.githubusercontent.com/grafana/loki/v3.0.0/cmd/loki/loki-local-config.yaml -O loki-config.yaml wget https://raw.githubusercontent.com/grafana/loki/v3.0.0/clients/cmd/promtail/promtail-docker-config.yaml -O promtail-config.yaml # 通过配置文件启动docker docker run --name loki -d -v $(pwd):/mnt/config -p 3100:3100 grafana/loki:3.0.0 -config.file=/mnt/config/loki-config.yaml docker run --name promtail -d -v $(pwd):/mnt/config -v /var/log:/var/log --link loki grafana/promtail:3.0.0 -config.file=/mnt/config/promtail-config.yaml # 验证一下容器是否启动 docker container ls 验证 Loki 是否已启动并正在运行。 要查看准备情况,请导航至 http://localhost:3100/ready。 要查看指标,请导航至 http://localhost:3100/metrics。 |
Docker Compose 安装
# 创建文件夹 mkdir loki cd loki # 下载docker-compose.yaml文件 wget https://raw.githubusercontent.com/grafana/loki/v3.0.0/production/docker-compose.yaml -O docker-compose.yaml # 通过docker-compose.yaml配置文件启动容器 docker-compose -f docker-compose.yaml up # 查看是否启动成功 docker-compose ls 验证 Loki 是否已启动并正在运行。 要查看准备情况,请导航至 http://localhost:3100/ready。 要查看指标,请导航至 http://localhost:3100/metrics。 |
Loki使用
数据更新
以下demo用到的时间戳是UNix毫秒级时间戳
1、Promtail(主动推送)
Promtail 是 Loki 的官方客户端之一,主要用于监控文件系统中的日志文件并将日志数据推送到 Loki 服务器。Promtail 使用配置文件来指定监控哪些日志文件,如何处理这些日志数据(例如,添加标签或通过管道处理日志内容),以及如何将数据发送到 Loki。这是 Loki 最常见且推荐的日志收集方式,特别适合收集主机或容器的日志。
官方文档:Promtail agent | Grafana Loki documentation
如果是docker方式安装的,直接修改/etc/promtail/config.yml文件
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: system // 修改为你自己的job名称 static_configs: - targets: - localhost labels: job: varlogs // 修改成自己的labels名称 __path__: /var/log/*log // 修改需要采集的日志地址 |
更多配置文件参数:Configure Promtail | Grafana Loki documentation
2、直接API请求(主动推送)
Loki 提供了 HTTP API,允许直接通过 HTTP 请求将日志数据推送到 Loki 的 /loki/api/v1/push
端点。这种方法为日志收集提供了最大的灵活性,适合于需要自定义集成或在特定情况下直接从应用程序发送日志的场景。
官方文档:Loki HTTP API | Grafana Loki documentation
{ "streams": [ { "stream": { "label": "value" // 这里可以指定label }, "values": [ [ "<unix epoch in nanoseconds>", "<log line>" ], // 这里需要传两个参数,一个是纳秒级时间戳,一个是日志内容 [ "<unix epoch in nanoseconds>", "<log line>" ] ] } ] } |
curl 请求demo
curl -H "Content-Type: application/json" \ -s -X POST "http://localhost:3100/loki/api/v1/push" \ --data-raw '{"streams": [{"stream": {"job": "myapp", "level": "info"}, "values": [["1715323025217319000", "2024-05-10T06:37:05 INFO Application started"]]}, {"stream": {"job": "myapp", "level": "error"}, "values": [["1715323025217319000", "2024-05-10T06:37:05 ERROR Failed to connect to database"]]}]}' |
python requests请求demo
# example of usage grafana/loki api when you need push any log/message from your python scipt import requests import json from datetime import datetime, timezone import time # Step 1: 获取纳秒级别的UNIX时间戳 timestamp_ns = time.time_ns() # 将纳秒时间戳转换为秒(因为 datetime.fromtimestamp() 需要秒级时间戳) timestamp_sec = timestamp_ns / 1_000_000_000 # 1s = 1_000_000_000ns # 转换时间戳到datetime对象 # dt_object = datetime.fromtimestamp(timestamp_sec, tz=ZoneInfo("Asia/Shanghai")) dt_object = datetime.fromtimestamp(timestamp_sec, tz=timezone.utc) # Step 2: 格式化时间为 '%Y-%m-%dT%H:%M:%S' formatted_time = dt_object.strftime('%Y-%m-%dT%H:%M:%S') # push msg log into grafana-loki url = 'http://localhost:3100/loki/api/v1/push' headers = { 'Content-type': 'application/json' } payload = { "streams": [ { "stream": { "job": "myapp", "level": "info" }, "values": [ [f"{timestamp_ns}", f"{formatted_time} INFO Application started"] ] }, { "stream": { "job": "myapp", "level": "error" }, "values": [ [f"{timestamp_ns}", f"{formatted_time} ERROR Failed to connect to database"] ] } ] } payload = json.dumps(payload) answer = requests.post(url, data=payload, headers=headers) print(answer.request.body) response = answer print(answer.status_code) # end pushing |
3、使用第三方客户端(主动推送)
你可以使用 Python 以及一些第三方库来推送日志数据到 Loki
支持多个客户端使用:Send log data to Loki | Grafana Loki documentation
python版本客户端-logging_loki,推送消息demo
import logging from logging_loki import LokiHandler # 配置日志记录器 logger = logging.getLogger("my_loki_logger") logger.setLevel(logging.DEBUG) # 设置日志级别 # 配置Loki handler loki_handler = LokiHandler( url="http://localhost:3100/loki/api/v1/push", # Loki服务的URL tags={"application": "my_python_app", "job": "test_log"}, # 设置全局标签 # auth=("username", "password"), # Loki的基本认证, 如果你的Loki设置了认证的话 version="1" # Loki日志协议的版本 ) # 将Loki handler添加到logger logger.addHandler(loki_handler) # 发送日志信息 logger.info("This is an info message") logger.error("This is an error message") |
数据查询
以下demo用到的时间戳是UNix毫秒级时间戳
1、使用http api查询数据
curl查询demo
curl -G -s "http://localhost:3100/loki/api/v1/query_range" \ --data-urlencode 'query={job="myapp"}' \ --data-urlencode 'start=1715323025217319000' \ --data-urlencode 'end=1715323625217319000' \ --data-urlencode 'step=30' |
2、使用python客户端查询
python requests查询demo
import requests # Loki 查询API的URL url = "http://localhost:3100/loki/api/v1/query_range" # 构造查询参数 params = { 'query': '{job="myapp"}', 'start': '1715323025217319000', 'end': '1715323625217319000', 'step': '30' } # 发起GET请求 response = requests.get(url, params=params) # 检查返回状态并打印响应内容 if response.status_code == 200: # 处理响应内容... print(response.json()) # 以JSON格式打印响应内容,方便查看 else: print("Failed to query Loki: HTTP status code", response.status_code) |
数据展示
配置grafana面板
1、添加数据库- Loki
首先先添加Loki为数据源,当你是docker-cmopose方式安装时,已经在grafana中配置了Loki数据源
如果是本地方案安装,需要手动添加一下数据源
2、添加dashboard
可以选择已有面板id导入:13639
面板链接:Logs / App | Grafana Labs
3、在app选择自己的job名称,选择时间段,即可看到日志内容
4、可以根据自己的需求继续优化面板