中小項目用ELK做日志?我準備玩點新花樣
項目做正規(guī)了,日志系統(tǒng)是少不了的。目前大部分日志平臺推薦基于ELK構建,不過ELK算是比較重了,架構太大,中小項目不太好Hold住,希望找一款簡單一些的,如果實在找不到再上ELK。之前儲備了一些技術候選庫,翻了翻果然有一款名叫Loki的日志系統(tǒng),可百度大部分都是電影里的這貨,不靠譜?
Loki
事實上日志系統(tǒng)的開發(fā)團隊靠譜的很,就是監(jiān)控領域大名鼎鼎的Grafana Labs,為人所熟知的有開源數(shù)據(jù)可視化工具Grafana、監(jiān)控系統(tǒng)Prometheus等等。
Loki是他們受 Prometheus 啟發(fā)打造的開源項目,是一款可擴展,高可用,支持多租戶的日志聚合系統(tǒng)。設計的理念就是為了讓日志聚合更簡單,它被設計為非常經(jīng)濟高效且易于操作。它不索引日志的內(nèi)容,而是為每個日志流設置一組標簽。它主要由三部分組成:
- Promtail是日志收集器,負責收集應用的日志并發(fā)送給Loki。
 - Loki用于日志的存儲和解析,并提供查詢API給下游展示。
 - Grafana負責將Loki的日志可視化。
 
Loki流程圖
看上去挺不錯的,我要試一試。
簡單上手
遇到新東西先跑個小DEMO,說實話目前國內(nèi)介紹這個的都沒有詳細的上手DEMO,尤其是和Spring Boot對接這一塊。我照著原版文檔,花了小半天終于跑成功了。
Loki安裝
首先是安裝,現(xiàn)在跑DEMO我優(yōu)先選擇快捷方便的Docker。下面是我修改過的Docker Compose腳本,根據(jù)你自己的需要改改就能一鍵啟動Loki。
- version: "3"
 - networks:
 - loki:
 - services:
 - loki:
 - image: grafana/loki:2.2.1
 - container_name: loki-service
 - volumes:
 - # 將loki的配置文件掛載到本地 c:/docker/loki 目錄
 - - c:/docker/loki:/etc/loki/
 - ports:
 - - "3100:3100"
 - command: -config.file=/etc/loki/loki.yml
 - networks:
 - - loki
 - promtail:
 - image: grafana/promtail:2.2.1
 - container_name: promtail-service
 - volumes:
 - # 為了讀取本地的日志目錄,這個是個默認配置目的就是為跑起來,生產(chǎn)肯定不是這樣的。
 - - c:/docker/log:/var/log/
 - # promtail 的配置文件也掛載到本地 c:/docker/promtail目錄
 - - c:/docker/promtail:/etc/promtail/
 - command: -config.file=/etc/promtail/promtail.yml
 - networks:
 - - loki
 - grafana:
 - image: grafana/grafana:latest
 - container_name: grafana-service
 - ports:
 - - "3000:3000"
 - networks:
 - - loki
 
上面的掛載目錄c:/docker/loki和c:/docker/promtail你根據(jù)自己的情況調整位置。
Loki的配置
上面文件中的-config.file=/etc/loki/loki.yml是Loki的配置文件,我們需要將配置文件loki.yml提前放在c:/docker/loki下,我使用默認配置:
- 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: 1h # Any chunk not receiving new logs in this time will be flushed
 - max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h
 - chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
 - chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
 - max_transfer_retries: 0 # Chunk transfers disabled
 - schema_config:
 - configs:
 - - from: 2020-10-24
 - store: boltdb-shipper
 - object_store: filesystem
 - schema: v11
 - index:
 - prefix: index_
 - period: 24h
 - storage_config:
 - boltdb_shipper:
 - active_index_directory: /loki/boltdb-shipper-active
 - cache_location: /loki/boltdb-shipper-cache
 - cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
 - shared_store: filesystem
 - filesystem:
 - directory: /loki/chunks
 - compactor:
 - working_directory: /loki/boltdb-shipper-compactor
 - shared_store: filesystem
 - limits_config:
 - reject_old_samples: true
 - reject_old_samples_max_age: 168h
 - chunk_store_config:
 - max_look_back_period: 0s
 - table_manager:
 - retention_deletes_enabled: false
 - retention_period: 0s
 - ruler:
 - storage:
 - type: local
 - local:
 - directory: /loki/rules
 - rule_path: /loki/rules-temp
 - alertmanager_url: http://localhost:9093
 - ring:
 - kvstore:
 - store: inmemory
 - enable_api: true
 
不要糾結這些配置項是干什么的,先跑起來再說,用到了去查文檔,要有的放矢。
Promtail的配置
和Loki類似,Promtail也要在本地掛載的c:/docker/promtail目錄下配置promtail.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
 - static_configs:
 - - targets:
 - - localhost
 - labels:
 - job: varlogs
 - # 這個跟掛載的位置有點關系,你可以猜猜
 - __path__: /var/log/*log
 
我猜測/var/log/*log就是讀取日志的位置,所以我把它掛載到本地c:/docker/log,等下弄點日志到本地這個目錄下,看看能讀取出來不。
啟動Loki
配置完畢后執(zhí)行docker-compose -f 
點擊圖中的Add data source
然后配置Loki的URL為http://loki:3100,然后點確定和測試,有綠色提示就表示成功了。
我們使用的是Docker Compose,因此hostname是服務名稱loki。
然后點擊側邊欄一個指南針形狀的圖標Explore,就進入日志的UI了,這時候啥也沒有。
得造點日志,搞一個Spring Boot應用,然后在application.yml中配置日志選項,然后啟動應用生成一些日志。
- logging:
 - file:
 - # 弄到疑似Promtail的日志讀取路徑試試
 - path: c:/docker/log
 - level:
 - org: debug
 
然后我輸入了一個從文檔中找到的查詢?nèi)罩镜谋磉_式(Loki query){filename="/var/log/spring.log"}, 文件名稱去c:/docker/log下看,有了有了!Nice!
Loki中查詢展示Spring Boot日志
總結
今天從零演示了Spring Boot對接日志新貴Loki,看上去還真不錯。學習新東西,要清楚它的場景,要清楚自己每一步的目標,先跑起來DEMO,再去研究定制化,最后才是底層原理。你學得越多就越熟練,你學得越多就越知道自己的短板,才能有目標和方向,不要盲目學,更不要過于追求底層原理。
本文轉載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關注。轉載本文請聯(lián)系碼農(nóng)小胖哥公眾號。





















 
 
 








 
 
 
 