中小项目用ELK做日志?我准备玩点新花样

举报
码农小胖哥 发表于 2022/03/31 23:57:59 2022/03/31
【摘要】 项目做正规了,日志系统是少不了的。目前大部分日志平台推荐基于ELK构建,不过ELK算是比较重了,架构太大,中小项目不太好Hold住,希望找一款简单一些的,如果实在找不到再上ELK。之前储备了一些技术候选库,翻了翻果然有一款名叫Loki的日志系统,可百度大部分都是电影里的这货,不靠谱? 复仇者联盟的Loki L...

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

复仇者联盟的Loki

Loki

事实上日志系统的开发团队靠谱的很,就是监控领域大名鼎鼎的Grafana Labs,为人所熟知的有开源数据可视化工具Grafana、监控系统Prometheus等等。

Loki是他们受 Prometheus 启发打造的开源项目,是一款可扩展,高可用,支持多租户的日志聚合系统。设计的理念就是为了让日志聚合更简单,它被设计为非常经济高效且易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。它主要由三部分组成:

  • Promtail是日志收集器,负责收集应用的日志并发送给Loki

  • Loki用于日志的存储和解析,并提供查询API给下游展示。

  • Grafana负责将Loki的日志可视化。

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/lokic:/docker/promtail你根据自己的情况调整位置。

Loki的配置

上面文件中的-config.file=/etc/loki/loki.ymlLoki的配置文件,我们需要将配置文件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 <docker-compose.yml 路径> up命令,会先下载镜像然后启动三个Docker容器。成功后打开http://localhost:3000/登录Grafana,默认账号密码是admin/admin。然后在侧边栏添加数据源为Loki:

点击图中的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
   
  

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

Loki中查询展示Spring Boot日志

总结

今天从零演示了Spring Boot对接日志新贵Loki,看上去还真不错。学习新东西,要清楚它的场景,要清楚自己每一步的目标,先跑起来DEMO,再去研究定制化,最后才是底层原理。你学得越多就越熟练,你学得越多就越知道自己的短板,才能有目标和方向,不要盲目学,更不要过于追求底层原理。好了,后面我会继续研究探索Loki如何在生产环境的实际运用,请持续关注:码农小胖哥,也请点赞,转发,给个鼓励。

如何在代码中获取Java应用当前的版本号?

2021-05-11

抱怨Swagger不好用?好吧我换一个好用的

2021-05-10

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/116773220

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。