以前有关注到 Loki 这个开源我的项目,还是 1.x 的,借鉴了prometheus 的 chunks 存储,labels, promql 查问等个性,做了一套日志零碎。

和 docker / k8s 集成比拟好,最近看到版本到 2.2,感觉能够小试一下

整体架构

下面的架构图,形容了 Loki 的几个根底组件

  • promtail: 日志采集组件,通过配置scrape_configs(嗯,看着和prometheus的采集配置如同啊),采集对应的本地文件,journal日志,应用positions(一个yaml配置文件),治理采集偏移量等,在通过http的形式,推送到远方的存储中
  • loki: 外围日志存储,查问组件,能够拆分为 querier,ingester, distributor 等多个组件,也能够部署为一个过程,数据存储能够落地为S3的文件中(大杀器啊,对象存储切实是太好用了)
  • grafana: 数据查问模块,能够应用LogQL(一种相似promql的语法)查问

当然还有一些其余组件,如loki-canary(日志链路可用性监控), fluentd(和fluentd对接的)等

梳理下需要

本人始终有多个 VPS,先看下本人有哪些节点

  • 3台VPS:广州,香港,美国各1, 配置1外围/2G ~ 2外围4G,都有公网IP
  • 1台软路由:没有公网IP,可上网
  • 1台NAS:11T硬盘,16G内存,家里,可上网

3 个都是 linux 零碎,而且下面的组件都容器化的,应用 docker-compose 治理,以前应用过 ELK,对于 VPS 来讲,太重了,始终找不到一个适合的日志零碎,当初能够在 loki 上小试牛刀

因为都曾经容器化,所以 docker 的规范输入是须要收集的,采集的需要总结如下

  • docker 规范输入
  • 本地的日志文件
  • systemd 日志文件

对应不通过的地区,还须要买通相干的网络环境,可能对立收集到内网的 NAS 中

如何收集 docker 规范输入日志

对于 docker 标出输入,默认实现上,是会落到本地文档的,能够通过docker inspect id, 返回的LogPath 看到具体文件门路地址

个别的采集计划,就是主动获取 LogPath,而后采集对应的文件即可

Loki 采纳的是实现了一个规范的 Docker Log Driver, 装置好插件,就能够间接推送了,应用流程如下

先部署 loki-docker-driver

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

在 docker 配置默认的 log-driver,重启 dockerd 过程

{    "live-restore": true,    "log-driver": "loki",    "log-opts": {        "loki-url": "http://127.0.0.1:16310/loki/api/v1/push",        "loki-external-labels": "instance=vpn"    }}

应用docker info命令,如果看到 Logging Driver: loki,那么阐明服务曾经装置/配置胜利

也能够对局部容器应用 loki 的日志,设置 docker run --log-driver=loki 等配置即可,具体能够参考下官网文档 Docker Driver Client

留神:如果是曾经存在的 docker 实例,须要销毁,重启后才会失效

和以前传统的计划有哪些区别呢?

  • 和服务发现配置文件相比,应用 driver 的形式,和 docker 集成度很高,对用户无感知,应用体验最好
  • 日志文件貌似不会再落地,间接推送到远端,实践上性能最高(当然也须要保障远端服务的高可用)
  • 有一个点,日志的可用性上,没有具体测试,比方 loki 万一挂了,是否会记录以后日志点,再重试推送等

如何收集本地的日志文件

在所有的日志场景中,必定有落地本地的业务日志,这个就须要 promtail 这个组件

promtail 也举荐容器化部署,把日志目录挂载到容器内即可,应用 docker-compose 部署示例如下

promtail:    container_name: promtail    image: grafana/promtail:2.2.0    restart: always    command: -config.file=/etc/loki/promtail.yaml -config.expand-env=true    environment:      - INSTANCE=www    extra_hosts:      - loki.ifooth.com:host-gateway    volumes:      - /data/logs/:/data/logs/      - /data/promtail:/data/promtail      - ../../etc/loki/:/etc/loki/

promtail 采集配置

server:  http_listen_port: 9080  grpc_listen_port: 0# 采集基准点, 保障不会反复采集日志positions:  filename: /data/promtail/positions.yaml# 近程地址clients:  - url: http://192.168.31.24:3100/loki/api/v1/push# 采集配置scrape_configs:  - job_name: app    static_configs:      - targets:          - localhost        labels:          instance: ${INSTANCE}          job: app          __path__: /data/logs/**/*.log

${INSTANCE} 等变量,能够应用 docker 的环境变量替换,又解决了一个应用的痛点

下面是最简略的示例,会采集 /data/logs/ 下任意目录下的任意 .log 后缀文件,其实 promtail 还有很弱小的 pipeline 性能,通过这个,能够把日志转换为 labels,查问效率很高

如何收集 systemd / journal 日志

在 linux 零碎中,必定还有些根底服务,比方 dockerd 过程,containerd 过程,kubelet 过程等等,都是必须以 systemd 的形式托管,这类怎么收集呢?

  • 一种计划是应用日志文件的形式采集,能够参考应用下面的步骤
  • 还有一种是应用 promtail 提供的journal性能
scrape_configs:  - job_name: journal    journal:      max_age: 24h      json: true      labels:        job: systemd-journal    relabel_configs:      - source_labels: ["__journal__systemd_unit"]        target_label: "unit"

下面这个给了 scrape_configs 就能够格式化的采集systemd文件,留神外面有个Path未配置,默认门路/var/log/journal, /run/log/journal

promtail 也反对 syslog 等其余形式,能够按需应用,因为这里没有需要,就没有再测试了

题外话:如何跨网络采集日志

在下面的场景中,都是采集日志,然而咱们的VPS,家里的软路由,都是不同区域的,如果把日志收集到一个中央那,比方我的 NAS 存储中

这个就须要用到我的反向代理了

frontend nas-loki    bind *:16310    mode http    default_backend nas-loki-backendsbackend nas-loki-backends    mode http    option httpchk    // 配置好http的check, loki提供了 /ready 检测接口    http-check send meth GET uri /ready ver HTTP/1.1 hdr Host loki.ifooth.com    server f-r-p 127.0.0.1:36071 check inter 2s    server v-2-r-a-y 127.0.0.1:19310 check inter 2s

通过 f-r-p, v-2-r-a-y 2个组件,别离建设2个反向代理的链路, 再通过 haproxy 做高可用,保障反向代理的稳定性

PS: 这里没有应用 nginx 做高可用的起因,是应该 haproxy 有其余的服务在应用,而且有可视化,弱小的健康检查,如果曾经有了 nginx 组件,也能够应用 nginx 实现

最初是 loki 的部署

loki 咱们的存储组件,如果是生产环境,必须要多少实例部署

loki 如果生产环境不是,会比较复杂,因为这里只有一个节点,所有就是应用了一个all in one形式,也能够应用

docker-compose 配置文件如下:

loki:    container_name: loki    image: grafana/loki:2.2.0    restart: always    command: -config.file=/etc/loki/loki.yaml    user: "0:0"    volumes:      - ../../etc/loki:/etc/loki      - /share/CACHEDEV2_DATA/data/loki:/data/loki    ports:      - "3100:3100"

配置文件传送门 -> loki.yaml

下面是单节点,存储应用本地的形式,如果没有大的存储,举荐是对接COS,S3等对象存储服务

应用 grafana 查看日志

下面的配置好了当前,就能够应用grafana查看日志了

首先须要配置数据源

在Explore参考中,能够查看咱们采集到的日志

这里只通过 label 过滤数据

在给一个含糊查问的 case

LogQL 分局部

  • 后面相似 promql 的局部,称为log stream selector,查问效率很高,然而必须是labels类型的数据,应用 prometheus 的4中过滤语法。留神, LogQL中,必须蕴含至多一个 selector
  • 前面的局部,称为log pipeline,是含糊查问,格式化,pipe 过滤等应用

通过 LogQL,还能够实现日志的根本统计,告警等

总结下

  • 十分轻量,4个节点,只应用大略1GB的内存,家用 NAS 也能够运行
  • 历史数据存储能够放 COS/S3 等对象存储,大量节俭资源
  • 基于 labels 的查问,速度十分块,也反对含糊查问等