Grafana日志聚合工具Loki搭建使用
特点
与其他日志聚合系统相比, Loki具有下面的一些特性:
- 不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
- 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
- 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。
- 受 Grafana 原生支持。
组成
- loki是主服务器,负责存储日志和处理查询。
- promtail是代理,负责收集日志并将其发送给 loki。
- Grafana 用于 UI 展示。
Loki
下载
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
|
配置
cd /usr/local/loki vi loki-local-config.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 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
|
启动
cd /usr/local/loki ./loki -config.file=loki-local-config.yaml
|
配置系统服务
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
|
配置好均需要执行以下命令
systemctl start loki.service systemctl status loki.service systemctl stop loki.service systemctl restart loki.service
|
Promtail
下载
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
|
配置
cd /usr/local/promtail vi promtail-local-config.yaml
|
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/*
|
启动
cd /usr/local/promtail ./promtail -config.file=promtail-local-config.yaml
|
配置系统服务
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
|
配置好执行以下命令
systemctl start promtail.service systemctl status promtail.service systemctl restart promtail.service systemctl stop promtail.service
|
Promtail页面
Grafana
下载
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
|
启动
cd /usr/share/grafana && grafana-server web
|
访问 http://localhost:3000
配置
执行成功进入到grafana登录页面。
默认账号密码都是admin
首次进入会提示修改密码。看清楚输入框。
创建一个data sources
这里填写的是loki的链接,这个链接可以访问,正常是返回数据,但有时候也可能返回404。目前没发现影响使用的地方
保存成功的提示是两个绿色的弹窗success
然后直接去查看explore
LogQL 语法
选择器
对于查询表达式的标签部分,将放在{}中,多个标签表达式用逗号分隔:
{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打如基础镜像
拉取基础镜像
docker pull 192.168.229.8:8551/centos:latest
|
启动基础镜像
docker run -d 92926cb8d09b tail -f /dev/null
|
复制文件到基础镜像
docker exec d8dcd4162411 mkdir /usr/local/promtail docker cp promtail d8dcd4162411:/usr/local/promtail docker cp promtail-local-config.yaml d8dcd4162411:/usr/local/promtail
|
给镜像打标记
docker commit d8dcd4162411 192.168.229.8:8551/centos:latest
|
推送镜像到镜像仓库
docker push 192.168.229.8:8551/centos:latest
|
更改启动文件
配置promtail开机启动,并建立本机ip的目录做日志区分
#!/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%左右,内存无明显变化