基於loki+promtail+grafana技術的日志集合


一、背景和動機

     近期運維工作中,隨着項目的不停優化以及上線。在與后端、測試協同工作的交流中發現,為了測試以及解決項目在上線過程中或者試運行中出現的bug報錯問題,開發同事對於日志的分析有着很大的需求。但是現在公司的日志查看主要是給予極少數的人員較大的權限,以及大量的需要運維人員幫忙登陸服務器查看服務日志進行下拉,復制黏貼給開發同事進行自主排錯。

     所以為了提高工作效率,同時也減輕運維同事的工作壓力。需要引入日志系統,統一收集日志,又同時可以在頁面中使得開發進行查看,極大的提高排錯效率。

 

二、技術對比

 

這里主要對比兩項技術ELKloki

 

2.1:技術特點

 

ELK:

 

優點:

 

    1、功能豐富,允許復雜的操作

 

    2、對數據的處理,清洗有着巨大的優勢,同時技術框架應用成熟,論壇等技術交流方法成熟。

 

劣勢:

 

1、方案往往規模復雜,資源占用高,操作難。很多功能往往用不上,大多數查詢只關注一定時間范圍和一些簡單的參數(如hostservice等),使用這些解決方案有點大材小用。

 

2、主流的ELK(全文檢索)或者EFK比較重

 

3KibanaGrafana之間切換,影響用戶體驗

 

4、倒排索引的切分和共享的成本較高

 

Loki:

 

優點:

 

1Loki的架構非常簡單,使用了和prometheus一樣的標簽來作為索引,通過這些標簽既可以查詢日志的內容也可以查詢到監控的數據,不但減少了兩種查詢之間的切換成本,也極大地降低了日志索引的存儲。

 

2、與ELK相比,消耗的成本更低,具有成本效益。

 

3、在日志的收集以及可視化上可以連用grafana,實現在日志上的篩選以及查看上下行的功能。

 

        缺點:

 

1、技術比較新穎,相對應的論壇不是非常活躍。

 

2、功能單一,只針對日志的查看,篩選有好的表現,對於數據的處理以及清洗沒有ELK強大,同時與ELK相比,對於后期,ELK可以連用各種技術進行日志的大數據處理,但是loki不行。

 

三、框架說明

 

Loki架構:

 

 

 

 

 

 

Loki使用了和prometheus一樣的標簽來作為索引,通過標簽既可以查詢日志的內容也可以查詢到監控的數據。Loki將使用與prometheus相同的服務發現和標簽重新標記庫編寫了的pormtail,在節點promtaildaemonset方式運行在每個節點中通過api將它們發送到Loki,然lokigrafana連用,實現日志的可視化顯示。

 

 

 

日志的存儲框架:

 

 

 

 

 

 

1、Distributor:第一個接收日志的組件,Loki通過構建壓縮數據塊來實現批處理和壓縮數據

 

2Ingester:組件ingester是一個有狀態的組件負責構建和刷新chunck,chunk達到一定的數量或者時間后,刷新到存儲中去。

 

3Querier:由Querier負責給定一個時間范圍和標簽選擇器,Querier查看索引以確定哪些塊匹配,並通過greps將結果顯示出來。

 

四、部署

 

下載docker鏡像
Docker pull grafana/loki:1.5.0
Docker pull grafana/promtail:latest
Docker pull grafana/grafana:latest

 

編寫docker-compose文件
 grafana:
    image: grafana/grafana:latest       //指定啟動鏡像
    user: root
    volumes:
      - ./grafana/provisioning/:/etc/grafana/provisioning/    //文件映射以及文件夾映射
      - ./grafana/grafana.ini:/etc/grafana/grafana.ini
      - /data/grafana:/var/lib/grafana
    ports:
      - 3000:3000                          //端口映射
    network_mode: 'host'                    //所屬網絡

  loki:
    image: grafana/loki:1.5.0                //啟動鏡像定義
    container_name: loki
    restart: always                       
    ports:
      - "3100:3100"
    volumes:
      - /root/elk/loki-local-config.yaml:/etc/loki/loki-local-config.yaml
    network_mode: 'host'

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    restart: always
    volumes:
      - /root/elk/promtail-docker-config.yaml:/etc/promtail/config.yml
      - /opt:/opt                       //該映射地址可以我定義為日志存放地址1
      - /var/log:/var/log                //該映射地址可以我定義為日志存放地址2
network_mode: 'host'

編寫promtailloki的啟動配置文件

 

Promtail的配置文件  vim  /root/elk/promtail-docker-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml   # 游標記錄上一次同步位置
  sync_period: 5s #10秒鍾同步一次

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

scrape_configs:
  - job_name: php-log
    static_configs:
      - targets:
          - localhost
        labels:
          job: php_logs
          __path__: /opt/loki/php/*log   # docker運行時已經把宿主機的目錄 /opt/ 

映射給了promtail 容器的 /opt/,所以這個地方可以直接訪問log文件

 

 - job_name: tomcat-log
    static_configs:
      - targets:
          - localhost
        labels:
          job: tomcat_logs
          __path__: /opt/loki/tomcat/*log   # docker運行時已經把宿主機的目錄 /opt/ 映射給了promtail 容器的 /opt/,所以這個地方可以直接訪問log文件
Loki配置文件  vim /root/elk/loki-local-config.yaml

 

參考官方

https://github.com/grafana/loki/blob/v1.3.0/docs/configuration/examples.md#complete-local-config

具體實例如下:

auth_enabled: false
server:
  http_listen_port: 3100
ingester:
  lifecycler:
    address: 192.168.18.21
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
schema_config:
  configs:
  - from: 2020-09-02
    store: boltdb
    object_store: filesystem
    schema: v11
    index:
      prefix: index_
      period: 168h
storage_config:
  boltdb:
    directory: /tmp/loki/index
  filesystem:
    directory: /tmp/loki/chunks
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
chunk_store_config:
  max_look_back_period: 0

table_manager:
  chunk_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  index_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  retention_deletes_enabled: false
  retention_period: 0

啟動容器

Docker-compose up -d

 

 

 

 

 


免責聲明!

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



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