Loki日志聚合

一、前言

Loki是Grafana团队开源日志项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。

官网: https://grafana.com/oss/loki/

二、特点

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

  1. 不对日志进行全文索引。Loki中存储的是压缩后的非结构化日志,并且只对元数据建立索引,因此Loki 具有操作简单、低成本的优势。
  2. 使用与 Prometheus 相同的标签。Loki通过标签对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  3. 特别适合储存 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会被自动删除和编入索引。
  4. Grafana 原生支持。

三、组成

Loki 日志系统由以下3个部分组成 :

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

四、安装

4.1 下载安装
#download : https://github.com/grafana/loki
mkdir -p /usr/local/loki/{sbin,conf,logs,data}
unzip loki-linux-amd64.zip -d /usr/local/loki/sbin/
unzip promtail-linux-amd64.zip -d /usr/local/loki/sbin/
cd /usr/local/loki/sbin/
mv loki-linux-amd64 loki
mv promtail-linux-amd64 promtail
4.2 配置
#配置loki服务
# vim /usr/local/loki/conf/loki.conf
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 39095 #grpc监听端口,默认为9095
  grpc_server_max_recv_msg_size: 15728640  #grpc最大接收消息值,默认4m
  grpc_server_max_send_msg_size: 15728640  #grpc最大发送消息值,默认4m

ingester:
  lifecycler:
    address: 10.0.0.10 #本机监听IP地址
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0
  #一个timeseries块在内存中的最大持续时间。如果timeseries运行的时间超过此时间,则当前块将刷新到存储并创建一个新块
  max_chunk_age: 20m 

schema_config:
  configs:
    - from: 2018-04-15
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h

storage_config:
  boltdb:
    directory: /usr/local/loki/data/index

  filesystem:
    directory: /usr/local/loki/data/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  ingestion_rate_mb: 30  #修改每用户摄入速率限制,即每秒样本量,默认值为4M
  ingestion_burst_size_mb: 15  #修改每用户摄入速率限制,即每秒样本量,默认值为6M

chunk_store_config:
  max_look_back_period: 168h   #回看日志行的最大时间,只适用于即时日志

table_manager:
  retention_deletes_enabled: true #日志保留周期开关,默认为false
  retention_period: 168h  #日志保留周期
#配置promtail服务
## vim /usr/local/loki/conf/promtail.conf
server:
  http_listen_port: 9080
  grpc_listen_port: 0
  grpc_server_max_recv_msg_size: 15728640
  grpc_server_max_send_msg_size: 15728640

positions:
  filename: /usr/local/loki/data/positions.yaml

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

scrape_configs:
- job_name: system_log
  static_configs:
  - targets:
      - localhost
    labels:
      #env: system  #打标签
      __path__: /var/log/messages #检索的本地日志文件
4.3 启动服务
#启动loki
nohup /usr/local/loki/sbin/loki \
-config.file=/usr/local/loki/conf/loki.conf >> /usr/local/loki/logs/loki.log &

#启动promtail
nohup /usr/local/loki/sbin/promtail \
-config.file=/usr/local/loki/conf/promtail.conf >> /usr/local/loki/logs/promtail.log &
4.4 大屏展示
#安装grafana服务,下载 :https://grafana.com/
yum -y localinstall grafana-7.3.1-1.x86_64.rpm
systemctl enable grafana-server
systemctl start grafana-server

五、查询日志

默认Grafana监听端口3000,在浏览器访问 http://ip:3000/ ,默认用户密码 admin/admin。

登录后,在配置中添加数据源,选择为 Loki 进行添加;

配置Loki连接地址,如下 ;

回到面板,点击 explore ,然后在左上角选择刚刚添加的数据源 ;

然后在 Log labels 中通过之前在 promtail 配置中定义的标签选择日志进行查看即可 ;

六、日志查询

Loki有自己的日志查询LogQL语句,支持在日志查看界面通过正则匹配查询关键日志。
写入日志流选择器后,可以使用搜索表达式进一步过滤生成的日志集,搜索表达式可以只是文本或正则表达式。

#日志过滤语句
{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{env="system"} |~ "msg"
{instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager"
#匹配过滤符
|=:日志行包含字符串
!=:日志行不包含字符串
|~:日志行匹配正则表达式
!~:日志行与正则表达式不匹配

七、代理访问

#配置grafana服务
vim /etc/grafana/grafana.ini
#
http_addr = 127.0.0.1
http_port = 30201
domain = localhost
root_url=%(protocol)s://%(domain)s:%(http_port)s/gflogs
#配置代理转发
server {
       location /gflogs/ {
            proxy_pass http://127.0.0.1:30201;
            rewrite ^/gflogs/(.*) /$1 break;
            access_log /usr/local/nginx/logs/loki/access.log main;
            error_log /usr/local/nginx/logs/loki/error.log warn;
       }
}