Grafana日志聚合工具Loki搭建使用

特点

与其他日志聚合系统相比, Loki具有下面的一些特性:

  • 不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
  • 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  • 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。
  • 受 Grafana 原生支持。

组成

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

Loki

下载
1
2
3
4
5
wget https://github.com/grafana/loki/releases/download/v1.6.0/loki-linux-amd64.zip
mkdir /usr/local/loki
unzip loki-linux-amd64.zip
mv loki-linux-amd64 loki
mv loki /usr/local/loki
配置
1
2
cd /usr/local/loki
vi loki-local-config.yaml
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
43
44
45
46
47
48
49
50
51
52
53
54
55
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
max_transfer_retries: 1

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

chunk_store_config:
max_look_back_period: 0

table_manager:
chunk_tables_provisioning:
inactive_read_throughput: 0
inactive_write_throughput: 0
provisioned_read_throughput: 0
provisioned_write_throughput: 0
index_tables_provisioning:
inactive_read_throughput: 0
inactive_write_throughput: 0
provisioned_read_throughput: 0
provisioned_write_throughput: 0
retention_deletes_enabled: false
retention_period: 0
启动
1
2
cd /usr/local/loki
./loki -config.file=loki-local-config.yaml
配置系统服务
1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/systemd/system/loki.service


[Unit]
Description=loki
Wants=network-online.target
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/loki/loki --config.file=/usr/local/loki/loki-local-config.yaml
[Install]
WantedBy=multi-user.target

配置好均需要执行以下命令

1
systemctl daemon-reload
  • 相关启动,停止命令
1
2
3
4
systemctl start loki.service
systemctl status loki.service
systemctl stop loki.service
systemctl restart loki.service

Promtail

下载
1
2
3
4
5
wget https://github.com/grafana/loki/releases/download/v1.6.0/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
mkdir /usr/local/promtail
mv promtail-linux-amd64 promtail
mv promtail /usr/local/promtail
配置
1
2
cd /usr/local/promtail
vi promtail-local-config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: /tmp/positions.yaml

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

scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*
启动
1
2
cd /usr/local/promtail
./promtail -config.file=promtail-local-config.yaml
配置系统服务
1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/systemd/system/promtail.service


[Unit]
Description=promtail
Wants=network-online.target
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/promtail/promtail --config.file=/usr/local/promtail/promtail-local-config.yaml
[Install]
WantedBy=multi-user.target

配置好执行以下命令

1
systemctl daemon-reload
  • 相关启动,停止命令
1
2
3
4
systemctl start  promtail.service
systemctl status promtail.service
systemctl restart promtail.service
systemctl stop promtail.service
Promtail页面

Grafana

下载
1
2
wget https://dl.grafana.com/oss/release/grafana-7.2.0-1.x86_64.rpm
sudo yum install grafana-7.2.0-1.x86_64.rpm
启动
1
cd /usr/share/grafana && grafana-server web

访问 http://localhost:3000

配置

执行成功进入到grafana登录页面。

默认账号密码都是admin

首次进入会提示修改密码。看清楚输入框。

创建一个data sources

这里填写的是loki的链接,这个链接可以访问,正常是返回数据,但有时候也可能返回404。目前没发现影响使用的地方

保存成功的提示是两个绿色的弹窗success

然后直接去查看explore

LogQL 语法
选择器

对于查询表达式的标签部分,将放在{}中,多个标签表达式用逗号分隔:

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

支持的符号有:

  • = 完全相同。
  • != 不平等。
  • =~ 正则表达式匹配。
  • !~ 不要正则表达式匹配。
过滤表达式

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

  • {job=“mysql”} |= “error”
  • {name=“kafka”} |~ “tsdb-ops.*io:2003”
  • {instance=~“kafka-[23]”,name=“kafka”} != kafka.server:type=ReplicaManager 支持多个过滤
  • {job=“mysql”} |= “error” != “timeout” 目前支持的操作符:
  • |= line包含字符串。
  • != line不包含字符串。
  • |~ line匹配正则表达式。
  • !~ line与正则表达式不匹配。

Loki语法 查询是ERROR的日志 |=”ERROR” 查询不是ERROR的日志 !=”ERROR”
查询含有4187的日志 又不是INFO级别的日志
{filename=”/home/app/logs/nHospitalService/app.2020-10-27.0.log”}!=”INFO” |=”4187”

查看更多

在查询出来的结果行后面有一个show context (查看上下文),点击这个按钮,默认展示结果行前10行和后10行。

实际应用

promtail打如基础镜像

拉取基础镜像

1
docker pull 192.168.229.8:8551/centos:latest

启动基础镜像

1
docker run -d 92926cb8d09b tail -f /dev/null

复制文件到基础镜像

1
2
3
docker exec d8dcd4162411  mkdir /usr/local/promtail
docker cp promtail d8dcd4162411:/usr/local/promtail
docker cp promtail-local-config.yaml d8dcd4162411:/usr/local/promtail

给镜像打标记

1
docker commit d8dcd4162411 192.168.229.8:8551/centos:latest

推送镜像到镜像仓库

1
docker push 192.168.229.8:8551/centos:latest
更改启动文件

配置promtail开机启动,并建立本机ip的目录做日志区分

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

cd /usr/local/promtail/
nohup ./promtail -config.file=promtail-local-config.yaml >> /usr/local/promtail.log 2>&1 &
JARFILE=/home/App.jar
ip=`hostname -I`
mkdir -p /var/log/$ip
cd /var/log/$ip

java -jar -Xms512M -Xmx1024M -Djava.security.egd=file:/dev/./urandom $JARFILE >> app.log &

tail -50f app.log
查看Grafana中是否区分

注:Grafana中不论区间大小,单次查询条数最大为5000,建议通过精确时间查询

采集性能

promtail在容器中,一秒钟采集1w行数据时,cpu为4-10%之间,内存无明显变化

loki收到promtail采集的数据时间内,cpu为3%左右,内存无明显变化