项目做正规了,日志系统是少不了的。目前大部分日志平台推荐基于ELK构建,不过ELK算是比较重了,架构太大,中小项目不太好Hold住,希望找一款简单L Q 4 t `一些的,如果实在找不到再上ELK= L ~ d p 8 +。之前储备了一些技术候选库,翻了翻果然有一款名叫Loki的日志系统,可百度大部分都是电影里的这货,不靠谱?

Loki

事实^ F A | C c \ 6上日志系统的开发团队靠谱的很,就是监控领域大名鼎鼎的Grafana Labs,为人所熟知的有开源数据可视化工具Grafh f J N `ana、监控系统Pro` C \ , u ! UmI ~ 1 v detheus等等。

Loki是他们受 Prometheus 启发I = 7 } U } 8打造的开源项目,是一款可扩展,高可用,支持多租户{ 5 } E ` u d ) %的日志聚/ r – X W e合系统。设计的理念就是为了让日志聚合更简单,它被设计为非常经济高效且易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。它主要由三部分组成:

  • Promtail是日志收集器,负责收集应用的日志并发送给Loki。
  • Loki用于日志的e 1 b 2 M ? 9存储和解U i j p x析,并提供查询API0 t ^ b – v y给下游展示。
  • Grafana负责将Loki的日志可视化。

Loki流程图

看上去挺不错的,我要试一试。

简单上手

遇到新东西先跑个小DEMO,说实话目前国内介绍这个的都没S o 4 V * 8有详细的上手DEMO4 s r % | u,尤其o & , ] ^ G m是和Spring Boot对接这一块。我照着原版文档,花了小半天终于跑成功了。

Loki安装

首先是安装,现在跑DEMOY o J H我优先选择快捷方便的Docker。下面是我修改过的Docker Compose脚本,根据你自己的需要改改就能一键启动Loki。

  1. version:"3"
  2. networks:
  3. loki:
  4. services:
  5. loki:
  6. image:grafana/loki:2.2.1
  7. c5 t p f & } n 0ontainer_name:loki-service3 F p I K ?
  8. volumes:
  9. #将loki的配置文件挂载到本地c:/docker/loki目录
  10. -c:/docker/loki:/etc/loki/
  11. ports:
  12. -"311 A I00:3100"
  13. c@ p s Qommand:-config.file=/etc/loki/loki.yml
  14. networks:
  15. -loki
  16. promtail:
  17. image:grafana/promtail:2.2.1
  18. container_name:promtail-service
  19. volumes:
  20. #为了读取本地的日志目录,这个是个默认配置目的就是为跑起来,生产肯定不是这样的。
  21. -c:/docker/log:/var/log/
  22. #promtail的配置文件也挂载到本地c:E 4 V a E R/docker/promtailu m $目录
  23. -c:/docker/promtail:/etc/promtail2 x ; % M #/
  24. command:-config.file=/r . I _ *etc/promtail/promtail.yml
  25. networks:
  26. -loki
  27. grafana:
  28. image:grafana/grafana:latest
  29. contai+ [ &ner_name:grafana-service
  30. ports:
  31. -"3000:3000"
  32. networks:
  33. -loki

上面的挂载目录c:/docker/loki和c:/docker/promtail你根据自己的情况调整位置。

Loki的配置

上面文件中的-config.file=/A ] ;etc/loki/l\ f 8 .oki.yml是Loki的配置文件,我们需要将配置文件loki.r 5 / + Uyml提前放在cP i a : V Y O W:/docker/loki下,我使用默认配置:

  1. auth_enabled:false
  2. server:
  3. http_listen_port:3100
  4. ingester:
  5. lifecycler:
  6. addresz O ls:127& A O Y 7.0.0.1
  7. rinv + + M } A r $ 4g:
  8. kvstore:
  9. store:inmemory
  10. replication_factor:s # 8 \1
  11. final_sleep:0s
  12. chunk_idle_period:1h#Anychunknotreceivingnewlogsinthistimewillbef, T { b O - Y # qlushed
  13. max_chunk_age:1h#Allchunkswillbeflushedwhentheyhitthisage,defaultis1h
  14. chunk_target_size:1048576#Lokiwillattempttobuildchunksupto1.5MB,flushingfirstifchunk_idle_periodormax_chunk_ageisreachedfirst
  15. chunk_retain1 4 o U V n_period:30s#M$ j G @ X yustQ _ * = 9begreaterthanindexreadcacheTTLifusinganindexcache(DefaultindexreadcacheTTLis5m)
  16. max_transfer_retries:0#Chunktransfersdisabled] 4 ; + B ^
  17. schema_config:
  18. configs:
  19. -from:2020-10-24
  20. stor: r * + h H ( Le:boltdb-shippe: = k M Pr
  21. object_store:filesystem
  22. schema:v11
  23. index:
  24. prefix:indeQ w vx_
  25. pe# a _ 2riod:24h
  26. stob } z ,rage_coH - N , I Onfig:
  27. boltdb_shipper:
  28. active_index_directory:/loki/boltdb-shipper-active
  29. cacheg r - @ - K i c_location:/loki/boltdb-shipper-cache
  30. cache_ttl:24h#Canbeincreasedforfasterperformanceoverlongerqueryperiods,usesmorediskspace
  31. shared_store:filesystem
  32. filesystem:
  33. directory:/loki/chunks
  34. compactor:
  35. working_directo) ) ` u 2 \ \ P jry:/loki/boltdb-shipper-compactor
  36. shared_store:filesystem
  37. limits_config:
  38. reject_old_samX { # E e 2 R Cples:true
  39. rejeA ` _ q = [ tct_olu M W 4 ? -d_sam| e w c } 2ples_max_age:e y x B m ] b W .168h
  40. chunk_store_config:
  41. max_look_back_period:0s
  42. table_manager:
  43. retent! B t a ] Rion_deletes_eB , V [nabled:false
  44. retention_perioi 0 G \d:0s
  45. ruler:
  46. storage:
  47. type:local
  48. local:
  49. directory:/loki/rules
  50. rulH { U . $ 4e_path:/loki/rules-temp
  51. alertmanager_url:http://localhost:9093
  52. ring:
  53. kvstore:
  54. store:inmemory
  55. enable_api:true

不要纠结这些配置项是干什么的,先跑起来再说,用到了去查文档,要有的放矢。

PromtaE % V 9 h 9 #il的配置

和Loki类似,Promtail也要在本地挂载的c:/dR E * s C 0 ` Hocker/promtail目录下配c v i 4 _ u x置promtail.yml,这里也使用默认配置:

  1. server:
  2. http_listen_port:9080
  3. grpc_listen_port:0
  4. positions:
  5. filename:/tmp/positions.yaml
  6. clients:
  7. -url:http://loki:3100/loki/api/v1/push
  8. scrape_configs:
  9. -job_name:system
  10. staticy c R R 4 6 /_configs:
  11. -targets:
  12. -localhost
  13. labels:
  14. job:v) G B / 4 [ marlogs
  15. #这个跟挂载的位置H ( e1 t . + d C F t点关系,你可以猜猜
  16. __path__:/var/log/*log

我猜测/var/log/*log就是读取日志的位置,所以我把它C l ^挂载到本地c:/docker/log,等下弄v 2 j y点日志到本地这个目录下,看看能读取出来不。

启动Loki

配置完毕后执行docZ / J \ pker-compose -f up命令,会先下载镜像然后启动三个Docker容器。成功后打开http://localhost:3000/登录Grafana,默认账号密码是admin/admin。然后在侧边栏添6 U 5 $ L l d A ~加数据源为Loki:

点击图中的Add data source

然后配置Loki的URL为http://loki:3100,然后点确定和测试,有绿色提示就表N i T !示成功了。

我们使用的是Docker Compose,因此hostname是服务名称loki。

然后点击侧边栏一个指南针形状的图标Explore,就进入日志的UIO n ; + U s了,这时候啥也没有。

得造点日志,搞一个Spring Boot应用,s $ l 0 p T C然后在application.yml中配置日志选项,然后启动应用生成一些日志。

  1. loggin. l C P \ 1 ? ) \g:
  2. file:
  3. #弄到疑似Promtail的日志读取路径试试
  4. path:c:/docker/log
  5. level:
  6. org:debug

然后我输入了一个从文档中找到的查询日志的表达式(Loki query){filename=”/var/log/spring.log”}, 文件名称去c:/docker/log下看,有了有了!Nice!

Loki中查询展示Sprink ] Ug Boot日志

总结

今天从a _ | c零演示了Spring Boot对接日志新贵Loki,看上去还真不D j ! . HO g w j m s Y。学习新东西,要清楚它的场景,要清楚自己每一步的目标Z M D ;,先跑起来DEMO,再去研究定制化,最后才是底层原理。你学得越h I j $多就越熟练,你学得越多就越知道自己的短板,才能有目标和方向,不要盲目学,更不要S A [ & e n m过于追求底层原理。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。