Docker方式安装Loki日志聚合系统

  1. 简单测试
  2. 抓取应用日志

基于Docker方式安装Loki聚合系统只能用于测试验证,不要直接在生产环境使用。
其实对于Docker方式的部署,官方文档已经做了非常详细的说明,整理此博客仅仅是记录自己在第一次接触和部署Loki时遇到的问题以及困惑,具体的部署步骤如下所述。

由于Loki系统包含3个组件,分别是:Loki(日志存储和处理),Promtail(将日志发送给Loki),Grafana(展示日志数据),所以需要部署3个Docker容器,可以直接基于Docker Compose方式实现。
在部署之前需要下载3个文件,分别是:Loki配置模板文件Promtail配置模板文件Docker Compose配置文件,下载到本地后分别命名为:
loki-local-config.yamlpromtail-docker-config.yamldocker-compose.yaml

简单测试

Loki配置模板文件(loki-local-config.yaml)默认内容如下:

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
#  reporting_enabled: false

暂时可以不用修改,直接使用即可。

Promtail模板配置文件(promtail-docker-config.yaml)默认内容如下:

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

文件docker-compose.yaml默认内容如下:

version: "3"

networks:
  loki:

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

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

  grafana:
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    entrypoint:
      - sh
      - -euc
      - |
        mkdir -p /etc/grafana/provisioning/datasources
        cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
        apiVersion: 1
        datasources:
        - name: Loki
          type: loki
          access: proxy
          orgId: 1
          url: http://loki:3100
          basicAuth: false
          isDefault: true
          version: 1
          editable: false
        EOF
        /run.sh
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

为了能够实现自定义配置,需要在将Loki和Promtail的本地配置文件挂载到Docker容器中:

loki:
    image: grafana/loki:2.9.0
    user: root
    ports:
      - "3100:3100"
    volumes:
      - ./loki-local-config.yaml:/etc/loki/local-config.yaml # 将Docker宿主机上的loki配置文件挂载到容器中
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

promtail:
    image: grafana/promtail:2.9.0
    volumes:
      - /var/log:/var/log
      - ./promtail-docker-config.yaml:/etc/promtail/config.yml # 将Docker宿主机上的promtail配置文件挂载到容器中
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

执行docker-compose -f docker-compose.yaml up后就可以启动相应容器实例:

$ docker-compose ps
NAME                IMAGE                    COMMAND                  SERVICE             CREATED             STATUS              PORTS
loki-grafana-1      grafana/grafana:latest   "sh -euc 'mkdir -p /…"   grafana             46 hours ago        Up 14 minutes       0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
loki-loki-1         grafana/loki:2.9.0       "/usr/bin/loki -conf…"   loki                46 minutes ago      Up 14 minutes       0.0.0.0:3100->3100/tcp, :::3100->3100/tcp
loki-promtail-1     grafana/promtail:2.9.0   "/usr/bin/promtail -…"   promtail            46 minutes ago      Up 14 minutes       

只要3个容器(分别是loki-lokiloki-promtailloki-grafana)都存在且状态为Up时,表明整个Loki日志聚合系统已经部署成功了。
访问Grafana的地址:http://host:3000,输入默认用户名和密码:admin/admin,第一次访问会提示修改密码(也可以跳过)。
进入到Explore界面,此时可能还看不到任何数据。

不要慌,这是正常的!
由于已经在Promtail的配置文件promtail-docker-config.yaml中默认添加了对/var/log/路径下日志的抓取:

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/**/*.log # 在promtail配置文件中添加了对指定路径日志的抓取,注意:这里抓取的是Docker容器实例内部的路径

同时,在docker-compose.yaml中将Docker宿主机目录/var/log挂载到了Promtail容器实例的/var/log目录上:

promtail:
  image: grafana/promtail:2.9.0
  volumes:
    - /var/log:/var/log # 将Docker宿主机目录/var/log挂载到容器中
    - ./promtail-docker-config.yaml:/etc/promtail/config.yml
  command: -config.file=/etc/promtail/config.yml
  networks:
    - loki

所以实际上Promtail抓取的是Docker宿主机目录/var/log下所有的.log文件数据,因此数据肯定是已经有了,目前就是还没找到正确查看日志数据的方式。

在Grafana界面上有2种日志标签过滤方式:filename,job。

当在Select label下拉框中选择标签为filename时,在Select value下拉框中可以看到采集的所有日志文件名。

再选中指定的文件名之后,点击右上角Run query按钮即可看到对应日志文件中的详细数据了。

当在Select label下拉框中选择标签为job时,在Select value下拉框中可以看到在Promtail配置文件中指定的job名称。

抓取应用日志

在上述简单测试中,默认只抓取了Docker宿主机上/var/log路径下的日志文件,如果需要抓取具体业务系统的日志信息,可以在Promtail配置文件中添加新的抓取配置:

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

# 如下是在Promtail中添加抓取应用系统日志的配置
- job_name: myapp # 区分不同抓取配置的标识
  static_configs:
  - targets:
      - localhost # 上报日志的Loki地址
    labels:
      job: myapp-log # 具体的任务名称,将来在Grafana中查询日志时作为过滤标签使用
      __path__: /myapp/logs/*log # 需要抓取的日志路径

注意:
如上在Promtail配置文件中添加了对应用系统日志的抓取配置,但是由于在本文中涉及的Promtail实例是Docker方式部署的,所以配置的抓取路径也是Docker容器内的日志路径。而应用系统可能是部署在Docker宿主机上的,因此还需要在docker-compose.yaml中对promtail服务添加对Docker宿主机上应用系统日志路径的挂载:

promtail:
  image: grafana/promtail:2.9.0
  volumes:
    - /var/log:/var/log
    - ~/myapp/logs:/myapp/logs # 将Docker宿主机上应用系统的日志路径挂载到容器中,否则Promtail无法抓取到具体的日志信息
    - ./promtail-docker-config.yaml:/etc/promtail/config.yml
  command: -config.file=/etc/promtail/config.yml
  networks:
    - loki

这个地方也是我第一次部署Loki时忽略了的,以至于无法在Grafana上查询到业务系统的日志信息。

完整配置详见test-loki

另外,对于Grafana的版本选择,个人觉得7.3.10易用性更好,可以在浏览器页面中可以展示更多的日志信息。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^