中小項(xiàng)目用ELK做日志?我準(zhǔn)備玩點(diǎn)新花樣
項(xiàng)目做正規(guī)了,日志系統(tǒng)是少不了的。目前大部分日志平臺(tái)推薦基于ELK構(gòu)建,不過ELK算是比較重了,架構(gòu)太大,中小項(xiàng)目不太好Hold住,希望找一款簡單一些的,如果實(shí)在找不到再上ELK。之前儲(chǔ)備了一些技術(shù)候選庫,翻了翻果然有一款名叫Loki的日志系統(tǒng),可百度大部分都是電影里的這貨,不靠譜?
Loki
事實(shí)上日志系統(tǒng)的開發(fā)團(tuán)隊(duì)靠譜的很,就是監(jiān)控領(lǐng)域大名鼎鼎的Grafana Labs,為人所熟知的有開源數(shù)據(jù)可視化工具Grafana、監(jiān)控系統(tǒng)Prometheus等等。
Loki是他們受 Prometheus 啟發(fā)打造的開源項(xiàng)目,是一款可擴(kuò)展,高可用,支持多租戶的日志聚合系統(tǒng)。設(shè)計(jì)的理念就是為了讓日志聚合更簡單,它被設(shè)計(jì)為非常經(jīng)濟(jì)高效且易于操作。它不索引日志的內(nèi)容,而是為每個(gè)日志流設(shè)置一組標(biāo)簽。它主要由三部分組成:
- Promtail是日志收集器,負(fù)責(zé)收集應(yīng)用的日志并發(fā)送給Loki。
- Loki用于日志的存儲(chǔ)和解析,并提供查詢API給下游展示。
- Grafana負(fù)責(zé)將Loki的日志可視化。
Loki流程圖
看上去挺不錯(cuò)的,我要試一試。
簡單上手
遇到新東西先跑個(gè)小DEMO,說實(shí)話目前國內(nèi)介紹這個(gè)的都沒有詳細(xì)的上手DEMO,尤其是和Spring Boot對(duì)接這一塊。我照著原版文檔,花了小半天終于跑成功了。
Loki安裝
首先是安裝,現(xiàn)在跑DEMO我優(yōu)先選擇快捷方便的Docker。下面是我修改過的Docker Compose腳本,根據(jù)你自己的需要改改就能一鍵啟動(dòng)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:
- # 為了讀取本地的日志目錄,這個(gè)是個(gè)默認(rèn)配置目的就是為跑起來,生產(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ù)自己的情況調(diào)整位置。
Loki的配置
上面文件中的-config.file=/etc/loki/loki.yml是Loki的配置文件,我們需要將配置文件loki.yml提前放在c:/docker/loki下,我使用默認(rèn)配置:
- 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
不要糾結(jié)這些配置項(xiàng)是干什么的,先跑起來再說,用到了去查文檔,要有的放矢。
Promtail的配置
和Loki類似,Promtail也要在本地掛載的c:/docker/promtail目錄下配置promtail.yml,這里也使用默認(rèn)配置:
- 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
- # 這個(gè)跟掛載的位置有點(diǎn)關(guān)系,你可以猜猜
- __path__: /var/log/*log
我猜測/var/log/*log就是讀取日志的位置,所以我把它掛載到本地c:/docker/log,等下弄點(diǎn)日志到本地這個(gè)目錄下,看看能讀取出來不。
啟動(dòng)Loki
配置完畢后執(zhí)行docker-compose -f
點(diǎn)擊圖中的Add data source
然后配置Loki的URL為http://loki:3100,然后點(diǎn)確定和測試,有綠色提示就表示成功了。
我們使用的是Docker Compose,因此hostname是服務(wù)名稱loki。
然后點(diǎn)擊側(cè)邊欄一個(gè)指南針形狀的圖標(biāo)Explore,就進(jìn)入日志的UI了,這時(shí)候啥也沒有。
得造點(diǎn)日志,搞一個(gè)Spring Boot應(yīng)用,然后在application.yml中配置日志選項(xiàng),然后啟動(dòng)應(yīng)用生成一些日志。
- logging:
- file:
- # 弄到疑似Promtail的日志讀取路徑試試
- path: c:/docker/log
- level:
- org: debug
然后我輸入了一個(gè)從文檔中找到的查詢?nèi)罩镜谋磉_(dá)式(Loki query){filename="/var/log/spring.log"}, 文件名稱去c:/docker/log下看,有了有了!Nice!
Loki中查詢展示Spring Boot日志
總結(jié)
今天從零演示了Spring Boot對(duì)接日志新貴Loki,看上去還真不錯(cuò)。學(xué)習(xí)新東西,要清楚它的場景,要清楚自己每一步的目標(biāo),先跑起來DEMO,再去研究定制化,最后才是底層原理。你學(xué)得越多就越熟練,你學(xué)得越多就越知道自己的短板,才能有目標(biāo)和方向,不要盲目學(xué),更不要過于追求底層原理。
本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。