使用 Loki 搭建個人日志平台


文章轉載自:https://blog.kelu.org/tech/2020/01/31/grafana-loki-for-logging-aggregation.html

背景

Loki的第一個穩定版本於2019年11月19日發布,是 Grafana Labs 團隊最新的開源項目,是一個水平可擴展,高可用性,多租戶的日志聚合系統。 Grafana 對 Loki 的描述如下:

Loki: like Prometheus, but for logs. Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost effective and easy to operate. It does not index the contents of the logs, but rather a set of labels for each log stream.

簡單說,Loki 是專門用於聚集日志數據,重點是高可用性和可伸縮性。與競爭對手不同的是,它確實易於安裝且資源效率極高。

目前運維大概上百個節點,雖然系統是統一的基線版本且使用docker運行應用,平時相安無事,但變更后的問題排查仍有點心有余悸。對一個火熱的日志系統elk也有淺嘗輒止,奈何對於非核心應用,多耗散一份算力意味着成本增加和利潤的減少,elk對於小團隊來說,還是過於笨重。趁着近日的疫情無法外出,調研后將 Loki 上線了生產,可以說是完美契合了中小團隊對日志平台的需求。

介紹

與其他日志聚合系統相比,Loki具有下面的一些特性:

  • 不對日志進行全文索引(vs ELK技)。通過存儲壓縮非結構化日志和僅索引元數據,Loki 操作起來會更簡單,更省成本。
  • 通過使用與 Prometheus 相同的標簽記錄流對日志進行索引和分組,這使得日志的擴展和操作效率更高。
  • 特別適合儲存 Kubernetes Pod 日志; 諸如 Pod 標簽之類的元數據會被自動刪除和編入索引。
  • 受 Grafana 原生支持。

Loki 由以下3個部分組成:

  • loki是主服務器,負責存儲日志和處理查詢。
  • promtail是代理,負責收集日志並將其發送給 loki 。
  • Grafana用於 UI 展示。

一、安裝

Docker-compose.yml 可以參考Loki文檔介紹,開箱即用。

version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/docker-config.yaml
    networks:
      - loki

  grafana:
    image: grafana/grafana:master
    ports:
      - "3000:3000"
    networks:
      - loki

然后直接使用 docker-compose 啟動即可:

$ docker-compose up -d

二、使用

安裝完成后,訪問節點的 3000 端口訪問 grafana,默認情況下使用(admin:admin)訪問 -> 選擇添加數據源:

在數據源列表中選擇Loki,配置 Loki 源地址:

源地址配置http://loki:3100即可,保存。

注意:這里的 http://loki:3100,表示訪問服務為loki的3100端口。

或者源地址配置成:http://production_loki_1:3100

注:http://production_loki_1:3100 意思是說訪問容器名為production_loki_1的3100端口(使用docker ps -a可以查看容器的名字)

保存完成后,切換到 grafana 左側區域的Explore,即可進入到Loki的頁面,點擊Log labels就可以把當前系統采集的日志標簽給顯示出來,可以根據這些標簽進行日志的過濾查詢:

圖中顯示的label是我自定義的 label,大家可以根據自己的業務需求定義自己的label。

三、配置

從上面的步驟已經可以一窺使用方法了,如果要使用起來,我們還需要了解如下信息:

Loki 的配置

Loki的詳細配置,可查看官方文檔:https://github.com/grafana/loki/blob/master/docs/README.md

配置相關文檔: https://github.com/grafana/loki/blob/v1.3.0/docs/configuration/README.md

我目前均保留了保留默認配置。

promtail的配置

promtail 是 Loki 的官方支持的日志采集端,在需要采集日志的節點上運行采集日志,再統一發送到 Loki 進行處理。我們編寫的大多是這一部分。

官方配置說明: https://github.com/grafana/loki/blob/v1.3.0/docs/clients/promtail/configuration.md

除了使用Promtail,社區還有很多采集日志的組件,比如fluentd、fluent bit等,都是比較優秀的。

這里是我的promtail配置,bj1是我的節點,在address等配置會域名解析成ip的方式。

server:
  http_listen_address: bj1
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /etc/promtail/positions.yaml
  sync_period: 10s

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

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: system
      app: system
      node: bj1
      __path__: /var/log/*log
- job_name: cron
  static_configs:
  - targets:
      - localhost
    labels:
      job: cron
      app: cron
      node: bj1
      __path__: /var/local/log/cron/*log

四、選擇器

對於查詢表達式的標簽部分,將其包裝在花括號中{},然后使用鍵值對的語法來選擇標簽,多個標簽表達式用逗號分隔,比如:

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

目前支持以下標簽匹配運算符:

  • =等於
  • !=不相等
  • =~正則表達式匹配
  • !~不匹配正則表達式

比如:

{name=~"mysql.+"}
{name!~"mysql.+"}

適用於Prometheus標簽選擇器規則同樣也適用於Loki日志流選擇器。

五、過濾器

編寫日志流選擇器后,您可以通過編寫搜索表達式來進一步過濾結果。搜索表達式可以只是文本或正則表達式。
查詢示例:

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

過濾器運算符可以被鏈接,並將順序過濾表達式-結果日志行將滿足每個過濾器。例如:

{job="mysql"} |= "error" != "timeout"

已實現以下過濾器類型:

|= 行包含字符串。
!= 行不包含字符串。
|~ 行匹配正則表達式。
!~ 行與正則表達式不匹配。
regex表達式接受RE2語法。默認情況下,匹配項區分大小寫,並且可以將regex切換為不區分大小寫的前綴(?i)。

更多內容可參考官方說明

舉例,我需要查詢包含關鍵字packages

{job="varlogs"} |= "packages"

效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM