Grafana+Loki+Promtail日志收集方案

前言

简介

Grafana项目由TorkelÖdegaard于2014年发起,最近几年成为GitHub上最受欢迎的开源项目之一。 它使您可以查询,可视化指标并记录警报,无论它们存储在何处。

Loki是受Prometheus启发的水平可扩展,高度可用的多租户日志聚合系统。 它被设计为非常经济高效且易于操作。 它不索引日志的内容,而是为每个日志流设置一组标签。

Promtail是将本地日志内容发送到私有Loki实例或Grafana Cloud的代理。 通常将其部署到需要监视应用程序的每台机器上。

方案对比

为什么选择Grafana + Loki + Promtail的日志采集方案呢?

我尝试过如下几种方案:

  • Elasticsearch+Kibana+Filebeat: 运维成本低,侵入性低,但是对于高并发情况下效果不太好,消耗资源也稍高,需要考虑日志存储成本
  • Elasticsearch+Kibana+Logstash+Kafka+Filebeat: 可以有效处理高并发情况,且在elk节点挂掉情况下不会丢失日志。但是,运维成本高,需要考虑日志存储成本,整套消耗资源比较高!
  • Grafana+Loki+Docker Driver Client:使用Docker Driver的方式来直接获取容器的日志,配置较简单,但是需要物理机上安装docker plugin,和运行容器时设置log-driver,侵入性较高

相比之下,当前选择的方案,对于我们当前业务场景下是较为合适的,轻量且侵入性低,由于是检测日志文件,无需担心存储成本。

通用日志收集

首先介绍下通用日志收集版本的部署。只需要使用默认配置即可收集普通日志,可在http://<your-ip>:3000上查看日志详情。

docker-compose

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.0.0
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.0.0
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

添加数据源

部署成功之后,打开http://<your-ip>:3000访问Grafana,在左侧菜单栏选择Configuration,默认进去Data Sources页面。

点击Add data sources按钮,选择Loki

截屏2021-04-14 下午2.02.57

填入URL即可,此处为http://loki:3100,具体要看实际部署。

截屏2021-04-14 下午2.03.47

然后点击Sace & Test添加。

查看与筛选日志

在左侧菜单栏选择Explore进入页面,点击左上角的Log brwser按钮,可以查看该数据源的labels,如此处为日志文件。

截屏2021-04-14 下午2.08.48

在页面顶部的输入框中输入官方的LogQL可以筛选日志。此处日志就不展示了,大家知道有就行了。

截屏2021-04-14 下午2.11.09

Docker容器日志收集

此处详细介绍下关于docker容器日志收集。

promtail配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
##config.yaml
server:
  http_listen_address: 0.0.0.0
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
- job_name: containers
  static_configs:
  - targets:
      - localhost
    labels:
      job: containerlogs
      __path__: /var/lib/docker/containers/*/*log

  pipeline_stages:
  - json:
      expressions:
        output: log
        stream: stream
        attrs:
  - json:
      expressions:
        tag:
      source: attrs
  - regex:
      expression: (?P<container_name>(?:[^|]*[^|]))
      source: "tag"
  - timestamp:
      format: RFC3339Nano
      source: time
  - labels:
      # tag:
      stream:
      container_name:
  - output:
      source: output

docker-compose

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.0.0
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.0.0
    volumes:
      - /var/lib/docker/containers:/var/lib/docker/containers
      - ./promtail-config.yaml:/mnt/config/promtail-config.yaml
    command: -config.file=/mnt/config/promtail-config.yaml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

容器日志展现形式

至此其实就已经可以在Grafana上看到当前容器的日志了,操作如上通用日志采集,但是其展现形式只是filename,也就是类似于107728869f40afa5510879a0e372c77bb513d6154591193d375bfcd421357ed4.log的以container_id展现的日志文件,难以辨认具体是哪个容器。(要是有功夫去登录服务器看下容器id,不如直接看下日志了…)

所以,为了能够使用容器名去查看日志,此处需要在容器启动时设置参数:

1
--log-driver json-file --log-opt tag="{{.Name}}"

举个例子:

1
docker run --name hello -p 8080:80 --log-driver json-file --log-opt tag="{{.Name}}" -d nginx

截屏2021-04-14 下午1.55.57

对于使用container name,还有另一种方案,就是每次生成container_name和container_id的映射表,个人认为比较麻烦,有兴趣的小伙伴儿可以尝试下。

参考文档

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy