中小項目用ELK做日志?我準備玩點新花樣
項目做正規了,日志系統是少不了的。目前大部分日志平臺推薦基于ELK構建,不過ELK算是比較重了,架構太大,中小項目不太好Hold住,希望找一款簡單一些的,如果實在找不到再上ELK。之前儲備了一些技術候選庫,翻了翻果然有一款名叫Loki的日志系統,可百度大部分都是電影里的這貨,不靠譜?

Loki
事實上日志系統的開發團隊靠譜的很,就是監控領域大名鼎鼎的Grafana Labs,為人所熟知的有開源數據可視化工具Grafana、監控系統prometheus等等。
Loki是他們受 prometheus 啟發打造的開源項目,是一款可擴展,高可用,支持多租戶的日志聚合系統。設計的理念就是為了讓日志聚合更簡單,它被設計為非常經濟高效且易于操作。它不索引日志的內容,而是為每個日志流設置一組標簽。它主要由三部分組成:
Promtail是日志收集器,負責收集應用的日志并發送給Loki。
Loki用于日志的存儲和解析,并提供查詢API給下游展示。
Grafana負責將Loki的日志可視化。
看上去挺不錯的,我要試一試。
簡單上手
遇到新東西先跑個小DEMO,說實話目前國內介紹這個的都沒有詳細的上手DEMO,尤其是和Spring Boot對接這一塊。我照著原版文檔,花了小半天終于跑成功了。
Loki安裝
首先是安裝,現在跑DEMO我優先選擇快捷方便的Docker。下面是我修改過的Docker Compose腳本,根據你自己的需要改改就能一鍵啟動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:
#??為了讀取本地的日志目錄,這個是個默認配置目的就是為跑起來,生產肯定不是這樣的。
-?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你根據自己的情況調整位置。
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
配置完畢后執行docker-compose -f
然后配置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
然后我輸入了一個從文檔中找到的查詢日志的表達式(Loki query){filename="/var/log/spring.log"}, 文件名稱去c:/docker/log下看,有了有了!Nice!
總結
今天從零演示了Spring Boot對接日志新貴Loki,看上去還真不錯。學習新東西,要清楚它的場景,要清楚自己每一步的目標,先跑起來DEMO,再去研究定制化,最后才是底層原理。你學得越多就越熟練,你學得越多就越知道自己的短板,才能有目標和方向,不要盲目學,更不要過于追求底層原理。好了,后面我會繼續研究探索Loki如何在生產環境的實際運用,請持續關注:碼農小胖哥,也請,轉發,給個鼓勵。
如何在代碼中獲取Java應用當前的版本號?
2021-05-11
抱怨Swagger不好用?好吧我換一個好用的
2021-05-10
Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。