03-Loki 日誌監控

公众号-JavaEdge發表於2024-06-14

1 Loki

1.1 簡介

功能強大;輕量級,可以在配置更低的裝置上部署;完全契合現代化部署方式;

github

Loki是受Prometheus啟發的水平可擴充套件、高可用、多租戶日誌聚合系統。它的設計非常具有成本效益且易於操作。它不索引日誌的內容,而是索引每個日誌流的一組標籤。

1.2 優點

與其他日誌聚合系統相比,Loki優勢在於:

不對日誌進行全文索引。透過儲存壓縮的非結構化日誌和僅索引後設資料,Loki 更易操作且執行成本更低。

使用你已經在 Prometheus 中使用的相同標籤對日誌流進行索引和分組,讓你能使用你已在 Prometheus 中使用的相同標籤在指標和日誌之間無縫切換。

尤其適合儲存 Kubernetes Pod 日誌。Pod 標籤等後設資料會被自動抓取和索引。

在 Grafana 中有本機支援(需要 Grafana v6.0)。

1.3 Loki日誌棧

  • promtail,代理,收集日誌併發給Loki

  • loki,主伺服器,儲存日誌和處理查詢

  • Grafana,查詢和顯示日誌

Loki 像 Prometheus,但對於日誌:我們更喜歡基於多維標籤的索引方法,並想要單二進位制、易於os且沒有依賴關係的系統。Loki 與 Prometheus 不同在於專注日誌而非指標,並透過push而非pull交付日誌。

1.4 下載及安裝

Github

① 解壓loki的安裝包至指定目錄(/data/software/loki/)

mkdir /data/software/loki/

unzip -q loki-linux-amd64.zip -d /data/software/loki/

② 新建或上傳loki配置檔案到指定目錄(/data/software/loki/etc)

mkdir /data/software/loki/etc

vim /data/software/loki/etc/loki-local-config.yaml
配置檔案內容
# 認證配置
auth_enabled: false

# 埠配置
server:
	# 監聽的埠
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2020-07-29
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h

# 儲存位置配置
storage_config:
	# 流檔案儲存地址
  boltdb:
  	# 自定義boltdb目錄
    directory: /data/software/loki/data/index
	# 索引儲存地址
  filesystem:
  	# 自定義filesystem目錄
    directory: /data/software/loki/data/chunks

# 採集限制配置
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  # 修改每使用者攝入速率限制,即每秒樣本量,預設值為4M
  ingestion_rate_mb: 30
  # 修改每使用者攝入速率限制,即每秒樣本量,預設值為6M
  ingestion_burst_size_mb: 15

# 日誌回看配置
chunk_store_config:
	#  max_look_back_period: 0s
	# 回看日誌行的最大時間,只適用於即時日誌,7天
  max_look_back_period: 168h

# 表的保留期配置
#table_manager:
#  retention_deletes_enabled: false
#  retention_period: 0s

table_manager:
	# 日誌保留週期開關,預設false
  retention_deletes_enabled: true
  # 日誌保留週期
  retention_period: 168h  

1.5 啟動loki

[root@service-monitoring etc]# nohup /data/software/loki/loki-linux-amd64 -config.file=/data/software/loki/etc/loki-local-config.yaml &
[1] 10508
[root@service-monitoring etc]# nohup: ignoring input and appending output to ‘nohup.out’

1.6 驗證是否啟動成功

[root@service-monitoring etc]# ps -ef|grep loki
root     10508  9405  0 17:27 pts/4    00:00:00 /data/software/loki/loki-linux-amd64 -config.file=/data/software/loki/etc/loki-local-config.yaml
root     10535  9405  0 17:27 pts/4    00:00:00 grep --color=auto loki

2 安裝promtail

Grafana可以和loki部署在同一臺伺服器。

而promtail需安裝在每臺有日誌輸出檔案的應用伺服器。

2.1 解壓安裝包至指定目錄

unzip -q promtail-linux-amd64.zip -d /data/software/promtail/

2.2 新建或上傳loki配置檔案到指定目錄

/data/software/promtail/etc/

vim /data/software/promtail/etc/promtail-local-config.yaml
配置檔案內容
# 埠配置
server:
  http_listen_port: 9080
  grpc_listen_port: 0

# 記錄遊標位置
positions:
	# 遊標記錄上一次同步位置
  filename: /data/software/promtail/tmp/positions.yaml
  # 每10s同步一次
  sync_period: 10s

# Loki伺服器地址
clients:
  - url: http://ip:3100/loki/api/v1/push

# 日誌檔案配置
scrape_configs:
- job_name: monitor-platform-task-test-job-name
  static_configs:
  - targets:
      - localhost
    labels:
      job: monitor-platform-task-test-job
      __path__: /usr/local/javaedge/monitor-platform/task/logs/monitor-platform-task.log

2.3 啟動promtail

[root@service-monitoring etc]# nohup /data/software/promtail/promtail-linux-amd64 -config.file=/data/software/promtail/etc/promtail-local-config.yaml &
[1] 12772
[root@service-monitoring etc]# nohup: ignoring input and appending output to ‘nohup.out’

2.4 驗證promtail是否啟動成功

[root@service-monitoring etc]# ps -ef|grep promtail
root     12772 12231  0 17:48 pts/1    00:00:00 /data/software/loki/promtail-linux-amd64 -config.file=/data/software/loki/etc/promtail-local-config.yaml
root     12796 12231  0 17:48 pts/1    00:00:00 grep --color=auto promtail

重啟

# 1 查詢正在執行的 Promtail 程序的 PID
[root@javaedge-car-receiver-test etc]# ps aux | grep promtail
root     12711  0.0  0.0 112712   964 pts/0    S+   16:26   0:00 grep --color=auto promtail
root     14423  0.4  0.8 1150788 65720 ?       Sl   Apr02 274:46 /data/software/promtail/promtail-linux-amd64 -config.file=/data/software/promtail/etc/promtail-local-config.yaml
# 這將顯示所有包含 promtail 的程序。找到與你之前啟動的 Promtail 例項對應的程序,記下其 PID。

# 2 停止正在執行的 Promtail 程序:
[root@javaedge-car-receiver-test etc]# kill PID
# 使用與原始啟動命令相同的命令來重新啟動 Promtail
[root@javaedge-car-receiver-test etc]# nohup /data/software/promtail/promtail-linux-amd64 -config.file=/data/software/promtail/etc/promtail-local-config.yaml &
[1] 12779
[root@javaedge-car-receiver-test etc]# nohup: ignoring input and appending output to ‘nohup.out’

[root@javaedge-car-receiver-test etc]# ps aux | grep promtail
root     12779 44.7  0.8 1150980 70088 pts/0   Sl   16:28   0:04 /data/software/promtail/promtail-linux-amd64 -config.file=/data/software/promtail/etc/promtail-local-config.yaml
root     12795  0.0  0.0 112712   968 pts/0    S+   16:29   0:00 grep --color=auto promtail
[root@javaedge-car-receiver-test etc]# 

3 在Grafana中新增Loki資料來源

進入Grafana,選擇 Configuration -> Data sources -> Add data source 進入選擇頁面,找到 Loki

選擇資料來源:

填寫 loki 地址:

儲存成功之後,切換到 Explore 選單,在頂部選擇資料來源中就能找到 Loki 了,選中它:

4 檢視日誌

進入連結:http://graphna部署ip:3000/explore:點選 Log browser 展開皮膚,在下面可以看見我們在 promtail 配置檔案中配置的標籤在這裡面出現了,並且中間有很多日誌檔案

選擇日誌檔案:

在右側隨意選擇一個標籤就可以過濾中間的檔案,只顯示到對應的服務的日誌檔案。
選擇一個檔案,然後可以看到下面有查詢語句,這個是 Loki 的查詢語言,與 Prometheus 查詢語言 PromQL 類似,可實現強大的搜尋過濾等查詢。

點選下面的 Show log 按鈕,即可檢視該日誌檔案最新的日誌內容:

常用功能說明:

5 日誌選擇和過濾

1 日誌選擇器

對於查詢表示式的標籤部分,將其用大括號括起來 {},然後使用鍵值語法選擇標籤。多個標籤表示式用逗號分隔。
例如下面這個查詢語句表示的就是查詢 job 標籤為 gps_server 中的 /var/log/gps_server/request.log 檔案

{filename="/var/log/gps_server/request.log",job="gps_server"}

支援以下標籤匹配運算子:

  • = 完全相等。
  • != 不相等。
  • =~ 正規表示式匹配。
  • !~ 不進行正規表示式匹配。

2 日誌過濾器

編寫日誌流選擇器後,可以透過編寫搜尋表示式來進一步過濾結果。搜尋表示式可以是文字或正規表示式。
示例:查詢所有請求 /v1/web/monitor/statistics 介面的日誌

{filename="/var/log/gps_server/request.log"}|="/v1/web/monitor/statistics"

匹配到結果之後還有高亮顯示

過濾器可以多個連續使用,例如:在錯誤中查詢關於郵件傳送失敗的日誌

{filename="/var/log/gps_server/runtime.log",job="gps_server"}|="ERRO"|="郵件"

可用的過濾器型別:

  • |= 行包含字串。
  • != 行不包含字串。
  • |~ 行匹配正規表示式。
  • !~ 行與正規表示式不匹配。 regex表示式接受RE2語法。預設情況下,匹配項區分大小寫,並且可以將regex切換為不區分大小寫的字首(?i)。

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章