Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。系统架构十分简单,由以下3个部分组成 :


  • Loki 是主服务器,负责存储日志和处理查询 。
  • promtail 是代理,负责收集日志并将其发送给 loki 。
  • Grafana 用于 UI 展示。

只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不关只有查询分析日志的能力,还能对日志进行监控和报警

二、系 统 架 构

loki日志管理系统_数据


  1. promtail收集并将日志发送给loki的 Distributor 组件
  2. Distributor会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到Ingester
  3. Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端
  4. Querier 收到HTTP查询请求,并将请求发送至Ingester 用以获取内存数据 ,Ingester 收到请求后返回符合条件的数据 ;
    如果 Ingester 没有返回数据,Querier 会从后端存储加载数据并遍历去重执行查询 ,通过HTTP返回查询结果

三、安 装 示 例

1、示例安装环境:


服务器

系统

IP

loki主机

Centos 7.6

192.168.93.138

promtail主机

Centos 7.6

192.168.93.131


2、下载安装软件



wget "https://github.com/grafana/loki/releases/download/v1.5.0/loki-linux-amd64.zip"
wget "https://github.com/grafana/loki/releases/download/v1.5.0/promtail-linux-amd64.zip"
wget https://dl.grafana.com/oss/release/grafana-6.7.4-1.x86_64.rpm


3、创建配置文件(loki.yaml和config.yaml)  存放目录:/etc/loki/

loki.yaml:



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: 5m
chunk_retain_period: 30s

schema_config:
configs:
- from: 2018-04-15
store: boltdb
object_store: filesystem
schema: v9
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


config.yaml(客户端把自己日志传给loki端):



# Promtail Server Config
server:
http_listen_port: 9080
grpc_listen_port: 0

# Positions
positions:
filename: /tmp/positions.yaml

# Loki服务器的地址
clients:
- url: http://127.0.0.1:3100/loki/api/v1/push

scrape_configs:
- job_name: linux
static_configs:
- targets:
- localhost
labels:
job: messages  
host: localhost
__path__: /var/log/messages*


4、安装Grafana



#安装依赖
yum install initscripts fontconfig freetype urw-fonts
#安装
rpm -ivh grafana-6.7.4-1.x86_64.rpm
#启动
systemctl start grafana-server
#开启自启
systemctl enable grafana-server


5、启动loki



nohup ./loki-linux-amd64 -config.file=/etc/loki/loki.yaml &


 loki日志管理系统_正则表达式_02

6、启动promtail



nohup ./promtail-linux-amd64 -config.file=/etc/loki/config.yaml &


loki日志管理系统_mysql_03

7、重启Grafana



systemctl restart grafana-server


8、从浏览器打开grafana:http:IP:3000;默认登陆用户和密码:admin/admin

loki日志管理系统_mysql_04

  点击”Greate a data source“ 添加数据源选择loki模块;

loki日志管理系统_数据_05

  添加HTTP的参数,然后”Save & Test“,然后进入"Explore"

loki日志管理系统_数据_06

LOKI日志聚合系统安装和配置完成。

四、配置

从上面的步骤已经可以一窥使用方法了,如果要使用起来,我们还需要了解如下信息:

Loki 的配置

我目前均保留了保留默认配置。

promtail的配置

promtail 是 Loki 的官方支持的日志采集端,在需要采集日志的节点上运行采集日志,再统一发送到 Loki 进行处理。我们编写的大多是这一部分。

除了使用Promtail,社区还有很多采集日志的组件,比如fluentd、fluent bit等,都是比较优秀的。

五、选择器

对于查询表达式的标签部分,将其包装在花括号中​​{}​​,然后使用键值对的语法来选择标签,多个标签表达式用逗号分隔,比如:



{app="mysql",name="mysql-backup"}


目前支持以下标签匹配运算符:


  • ​=​​等于
  • ​!=​​不相等
  • ​=~​​正则表达式匹配
  • ​!~​​不匹配正则表达式

比如:



{name=~"mysql.+"}
{name!~"mysql.+"}


适用于​​Prometheus​​​标签选择器规则同样也适用于​​Loki​​日志流选择器。

六、过滤器

编写日志流选择器后,您可以通过编写搜索表达式来进一步过滤结果。搜索表达式可以只是文本或正则表达式。

查询示例:



{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager


过滤器运算符可以被链接,并将顺序过滤表达式-结果日志行将满足每个过滤器。例如:



{job="mysql"} |= "error" != "timeout"


已实现以下过滤器类型:


  • |= 行包含字符串。
  • != 行不包含字符串。
  • |~ 行匹配正则表达式。
  • !~ 行与正则表达式不匹配。
    regex表达式接受RE2语法。默认情况下,匹配项区分大小写,并且可以将regex切换为不区分大小写的前缀(?i)。