Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。系统架构十分简单,由以下3个部分组成 :
- Loki 是主服务器,负责存储日志和处理查询 。
- promtail 是代理,负责收集日志并将其发送给 loki 。
- Grafana 用于 UI 展示。
只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不关只有查询分析日志的能力,还能对日志进行监控和报警
二、系 统 架 构
- promtail收集并将日志发送给loki的 Distributor 组件
- Distributor会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到Ingester
- Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端
- 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 &
6、启动promtail
nohup ./promtail-linux-amd64 -config.file=/etc/loki/config.yaml &
7、重启Grafana
systemctl restart grafana-server
8、从浏览器打开grafana:http:IP:3000;默认登陆用户和密码:admin/admin
点击”Greate a data source“ 添加数据源选择loki模块;
添加HTTP的参数,然后”Save & Test“,然后进入"Explore"
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)。 -