从Grep 到 Grafana Loki 的日志分析之路


我走了太多弯路

说实话,在日志处理这件事上,我被“知识陷阱”困了很久。

因为我太熟悉命令行了,grep、rg、awk 玩得飞起,所以过去很长一段时间,我都固执地认为这就是分析日志的“正统”方式。但现实经常打脸:当日志散落在不同服务器、不同路径下时,我得开无数个终端窗口跳来跳去,查个链路问题跟查案一样。

更惨的是,以前公司不给硬件资源,我根本不敢想 Elasticsearch 这种“吞金兽”。为了解决查询问题,我还自己折腾过一套特原始的方案:写脚本去 OSS 上拉压缩包,下载、解压、再用 rg 扫。还能只查找固定时间短的日志,使用者必须先在 GM 后台上查询到用户的登录记录,再根据日期查询具体时间的日志。

后来入职新公司,我这套“土法炼钢”的操作甚至被同事吐槽过:“你怎么还在当原始人?我们早都用 Grafana 查了。”

直到最近,我硬着头皮自己试着搭了一套 Grafana + Loki + Promtail,真的感觉推开了新世界的大门。那种震撼感在于:我只花了不到三十分钟部署,那种多机协同、可视化检索的爽感,瞬间就秒杀了过去几年的肉搏操作。

现在回头看,天天蹲在黑框框里人肉搜索,确实像个原始人。这篇文章就记录一下这个让我“走出石器时代”的工具组合,以及我的安装过程。讲真,以后哪怕项目再小、只有一个服务,我也要把日志接入 Loki。人生苦短,不要把生命浪费在 cd 和 grep 上。

记录安装过程

轻量 Loki + Grafana
Loki 用来收集日志,Grafana 用来查询。这两者不需要安装在同一台机器,网络通畅即可。

  1. Loki
# 下载 Loki
cd /tmp
wget https://github.com/grafana/loki/releases/download/v2.9.0/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
chmod +x loki-linux-amd64
sudo mv loki-linux-amd64 /usr/local/bin/loki

# 创建配置目录
sudo mkdir -p /etc/loki
sudo mkdir -p /var/lib/loki

# 创建配置文件
sudo vim /etc/loki/config.yaml

配置文件内容

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  path_prefix: /var/lib/loki
  storage:
    filesystem:
      chunks_directory: /var/lib/loki/chunks
      rules_directory: /var/lib/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /var/lib/loki/boltdb-shipper-active
    cache_location: /var/lib/loki/boltdb-shipper-cache
    shared_store: filesystem

limits_config:
  retention_period: 744h  # 31天
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  ingestion_rate_mb: 16
  ingestion_burst_size_mb: 32

创建 systemd 服务

sudo vim /etc/systemd/system/loki.service


[Unit]
Description=Loki log aggregation system
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

启动

sudo systemctl daemon-reload
sudo systemctl start loki
sudo systemctl enable loki
sudo systemctl status loki
  1. Promtail

用来将日志上传到 Loki,安装在收集日志的服务器上面。

安装

# 下载 Promtail
cd /tmp
wget https://github.com/grafana/loki/releases/download/v2.9.0/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
chmod +x promtail-linux-amd64
sudo mv promtail-linux-amd64 /usr/local/bin/promtail

# 创建配置目录
sudo mkdir -p /etc/promtail

# 创建配置文件
sudo vim /etc/promtail/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:
  # Gateway 服务日志
  - job_name: gateway
    static_configs:
      - targets:
          - localhost
        labels:
          job: gateway
          service: gateway
          __path__: /var/log/gateway/*.log
    pipeline_stages:
      - json:
          expressions:
            level: level
            request_id: request_id
            msg: msg
            timestamp: ts
            method: method
            path: path
            status: status
      - labels:
          level:
          request_id:
      - timestamp:
          source: timestamp
          format: RFC3339Nano

  # 内部服务日志(可以配置多个 job,收集多个目录的日志)
  - job_name: internal-service
    static_configs:
      - targets:
          - localhost
        labels:
          job: internal-service
          service: internal-service
          __path__: /var/log/internal-service/*.log
    pipeline_stages:
      - json:
          expressions:
            level: level
            request_id: request_id
            msg: msg
            timestamp: ts
      - labels:
          level:
          request_id:
      - timestamp:
          source: timestamp
          format: RFC3339Nano

创建启动脚本

sudo vim /etc/systemd/system/promtail.service

脚本内容

[Unit]
Description=Promtail log collector
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

启动

sudo systemctl daemon-reload
sudo systemctl start promtail
sudo systemctl enable promtail
sudo systemctl status promtail
  1. Grafana

用于展示与查询日志

# 添加 Grafana 仓库
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo wget -q -O - https://packages.grafana.com/gpg.key | apt-key add -

# 如果出现以下报错
W: GPG error: https://packages.grafana.com/oss/deb stable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 963FA27710458545

E: The repository 'https://packages.grafana.com/oss/deb stable InRelease' is not signed.

N: Updating from such a repository can't be done securely, and is therefore disabled by default.

N: See apt-secure(8) manpage for repository creation and user configuration details.

# 由于手动添加了 Grafana 的存储库,系统本地没有对应的公钥来验证软件包的签名,导致安全检查失败。
# 将报错提示的 ID 为 963FA27710458545 的公钥导入系统的受信任的密钥库中
sudo mkdir -p /etc/apt/keyrings
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
# 关联密钥与存储库
# 查找 list 文件,文件位置:/etc/apt/sources.list.d/archive_uri-https_packages_grafana_com_oss_deb-noble.list
# 修改文件内容,将内容修改为指向刚才下载的密钥:
deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://packages.grafana.com/oss/deb stable main

# 安装
sudo apt-get update
sudo apt-get install grafana -y

# 启动
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

我又学到新东西啦,由于 apt 通常需要 sudo 权限,直接 export 变量可能不会被 sudo 环境继承,所以建议直接写在命令前,或者使用 sudo -E。

sudo https_proxy=http://127.0.0.1:7890 apt install grafana

开始 Grafana 之旅

  1. 打开网页,默认的端口是 3000,我的机器为 http://192.168.200.30:3000

  2. 默认的账号和密码均为 admin

  3. 登录会提示修改密码,可以选择跳过,为了安全,最好设置一个新的密码。

  4. 选择 Explore,点击 Outline 右侧的下拉菜单,选择 Open advanced data source picker->

  5. 点击 Configure a new data source

  6. 选择 Loggin & document databases 下面的 Loki

  7. 配置 URL,也是唯一的必填参数,表示从访问那个机器上的 Loki 日志,我的配置 URL 为 http://192.168.200.30:3100

  8. 点击 Save & Test,如果显示成功,则可以选择 Loki 并查询日志啦