💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] > [home](https://grafana.com/oss/loki/) ## 概述 和其他日志系统不同的是,Loki 只会对你的日志元数据标签(就像 Prometheus 的标签一样)进行索引,而不会对原始的日志数据进行全文索引。然后日志数据本身会被压缩,并以 chunks(块)的形式存储在对象存储(比如 S3 或者 GCS)甚至本地文件系统。一个小的索引和高度压缩的 chunks 可以大大简化操作和降低 Loki 的使用成本 ## 对比其他日志系统 **Elasticsearch** - 中的数据以非结构化 JSON 对象的形式存储在磁盘上。每个对象的键和每个键的内容都有索引。然后可以使用 JSON 对象来定义查询(称为 Query DSL)或通过 Lucene 查询语言来查询数据。 **单二进制模式下的 Loki** - 可以将数据存储在磁盘上,但在水平可扩展模式下,数据存储需要在云存储系统中,如 S3、GCS 或 Cassandra。日志以纯文本的形式存储,并标记了一组标签的名称和值,其中只有标签会被索引。这种权衡使其操作起来比完全索引更便宜。Loki 中的日志使用 LogQL 进行查询 **Fluentd** - 通常用于收集日志并转发到 Elasticsearch。Fluentd 被称为数据收集器,它可以从许多来源采集日志,并对其进行处理,然后转发到一个或多个目标 日志格式 ![](https://img.kancloud.cn/f8/56/f8560299c283a753fc6500482d9c9dc8_947x285.png) Loki 采用独特的方法,**仅索引元数据**而不是日志行的全文 ## 示例 ### go 接入 loki <details> <summary>main.go</summary> ``` package main import ( "bytes" "encoding/json" "fmt" "log" "net/http" "time" ) // 定义日志流的结构 type LogStream struct { Stream map[string]string `json:"stream"` Values [][]string `json:"values"` } // 定义 Loki 推送数据的结构 type LokiPushRequest struct { Streams []LogStream `json:"streams"` } func main() { // Loki 的 URL(根据你的环境修改) lokiURL := "http://localhost:3100/loki/api/v1/push" // 创建一个日志流,使用标签标识日志流 logStream := LogStream{ Stream: map[string]string{ "job": "example-job", "env": "production", }, // 定义日志的时间戳和日志内容 Values: [][]string{ {fmt.Sprintf("%d", time.Now().UnixNano()/int64(time.Millisecond)), "This is a test log message."}, }, } // 构建 Loki 推送请求数据 pushRequest := LokiPushRequest{ Streams: []LogStream{logStream}, } // 将请求数据转换为 JSON 格式 payload, err := json.Marshal(pushRequest) if err != nil { log.Fatalf("Error marshaling request: %v", err) } // 发送 POST 请求将日志推送到 Loki resp, err := http.Post(lokiURL, "application/json", bytes.NewBuffer(payload)) if err != nil { log.Fatalf("Error sending request to Loki: %v", err) } defer resp.Body.Close() // 打印响应状态 fmt.Printf("Response status: %s\n", resp.Status) } ``` </details> ### 使用 promatil 对已存在的日志文件解析 1. 需要先启动 loki 服务 2. 配置 Promtail ``` server: http_listen_port: 9080 clients: - url: http://localhost:3100/loki/api/v1/push # Loki 服务的地址 positions: filename: /tmp/positions.yaml # 用于存储日志文件的位置偏移 scrape_configs: - job_name: 'system' static_configs: - targets: - localhost labels: job: 'varlogs' __path__: /var/log/your_project/*.log # 这里是你的日志文件路径 ``` 3. 启动 Promtail ``` promtail -config.file=/path/to/promtail-config.yaml ```