基于loki+promtail+grafana技术的日志集合

一、背景和动机

     近期运维工作中,随着项目的不停优化以及上线。在与后端、测试协同工作的交流中发现,为了测试以及解决项目在上线过程中或者试运行中出现的bug报错问题,开发同事对于日志的分析有着很大的需求。但是现在公司的日志查看主要是给予极少数的人员较大的权限,以及大量的需要运维人员帮忙登陆服务器查看服务日志进行下拉,复制黏贴给开发同事进行自主排错。

     所以为了提高工作效率,同时也减轻运维同事的工作压力。需要引入日志系统,统一收集日志,又同时可以在页面中使得开发进行查看,极大的提高排错效率。

 

二、技术对比

 

这里主要对比两项技术ELKloki

 

2.1:技术特点

 

ELK:

 

优点:

 

    1、功能丰富,允许复杂的操作

 

    2、对数据的处理,清洗有着巨大的优势,同时技术框架应用成熟,论坛等技术交流方法成熟。

 

劣势:

 

1、方案往往规模复杂,资源占用高,操作难。很多功能往往用不上,大多数查询只关注一定时间范围和一些简单的参数(如hostservice等),使用这些解决方案有点大材小用。

 

2、主流的ELK(全文检索)或者EFK比较重

 

3KibanaGrafana之间切换,影响用户体验

 

4、倒排索引的切分和共享的成本较高

 

Loki:

 

优点:

 

1Loki的架构非常简单,使用了和prometheus一样的标签来作为索引,通过这些标签既可以查询日志的内容也可以查询到监控的数据,不但减少了两种查询之间的切换成本,也极大地降低了日志索引的存储。

 

2、与ELK相比,消耗的成本更低,具有成本效益。

 

3、在日志的收集以及可视化上可以连用grafana,实现在日志上的筛选以及查看上下行的功能。

 

        缺点:

 

1、技术比较新颖,相对应的论坛不是非常活跃。

 

2、功能单一,只针对日志的查看,筛选有好的表现,对于数据的处理以及清洗没有ELK强大,同时与ELK相比,对于后期,ELK可以连用各种技术进行日志的大数据处理,但是loki不行。

 

三、框架说明

 

Loki架构:

 

 

 

 

 

 

Loki使用了和prometheus一样的标签来作为索引,通过标签既可以查询日志的内容也可以查询到监控的数据。Loki将使用与prometheus相同的服务发现和标签重新标记库编写了的pormtail,在节点promtaildaemonset方式运行在每个节点中通过api将它们发送到Loki,然lokigrafana连用,实现日志的可视化显示。

 

 

 

日志的存储框架:

 

 

 

 

 

 

1、Distributor:第一个接收日志的组件,Loki通过构建压缩数据块来实现批处理和压缩数据

 

2Ingester:组件ingester是一个有状态的组件负责构建和刷新chunck,chunk达到一定的数量或者时间后,刷新到存储中去。

 

3Querier:由Querier负责给定一个时间范围和标签选择器,Querier查看索引以确定哪些块匹配,并通过greps将结果显示出来。

 

四、部署

 

下载docker镜像
Docker pull grafana/loki:1.5.0
Docker pull grafana/promtail:latest
Docker pull grafana/grafana:latest

 

复制代码
编写docker-compose文件
 grafana:
    image: grafana/grafana:latest       //指定启动镜像
    user: root
    volumes:
      - ./grafana/provisioning/:/etc/grafana/provisioning/    //文件映射以及文件夹映射
      - ./grafana/grafana.ini:/etc/grafana/grafana.ini
      - /data/grafana:/var/lib/grafana
    ports:
      - 3000:3000                          //端口映射
    network_mode: 'host'                    //所属网络

  loki:
    image: grafana/loki:1.5.0                //启动镜像定义
    container_name: loki
    restart: always                       
    ports:
      - "3100:3100"
    volumes:
      - /root/elk/loki-local-config.yaml:/etc/loki/loki-local-config.yaml
    network_mode: 'host'

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    restart: always
    volumes:
      - /root/elk/promtail-docker-config.yaml:/etc/promtail/config.yml
      - /opt:/opt                       //该映射地址可以我定义为日志存放地址1
      - /var/log:/var/log                //该映射地址可以我定义为日志存放地址2
network_mode: 'host'
复制代码

编写promtailloki的启动配置文件

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Promtail的配置文件  vim  /root/elk/promtail-docker-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0
 
positions:
  filename: /tmp/positions.yaml   # 游标记录上一次同步位置
  sync_period: 5s #10秒钟同步一次
 
clients:
  - url: http://192.168.18.21:3100/loki/api/v1/push
 
scrape_configs:
  - job_name: php-log
    static_configs:
      - targets:
          - localhost
        labels:
          job: php_logs
          __path__: /opt/loki/php/*log   # docker运行时已经把宿主机的目录 /opt/

映射给了promtail 容器的 /opt/,所以这个地方可以直接访问log文件

 

 - job_name: tomcat-log
    static_configs:
      - targets:
          - localhost
        labels:
          job: tomcat_logs
          __path__: /opt/loki/tomcat/*log   # docker运行时已经把宿主机的目录 /opt/ 映射给了promtail 容器的 /opt/,所以这个地方可以直接访问log文件
Loki配置文件  vim /root/elk/loki-local-config.yaml

 

参考官方

https://github.com/grafana/loki/blob/v1.3.0/docs/configuration/examples.md#complete-local-config

具体实例如下:

复制代码
auth_enabled: false
server:
  http_listen_port: 3100
ingester:
  lifecycler:
    address: 192.168.18.21
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
schema_config:
  configs:
  - from: 2020-09-02
    store: boltdb
    object_store: filesystem
    schema: v11
    index:
      prefix: index_
      period: 168h
storage_config:
  boltdb:
    directory: /tmp/loki/index
  filesystem:
    directory: /tmp/loki/chunks
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
chunk_store_config:
  max_look_back_period: 0

table_manager:
  chunk_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  index_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  retention_deletes_enabled: false
  retention_period: 0
复制代码

启动容器

Docker-compose up -d

 

 

 

 

 

posted @   余球球  阅读(2617)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示