我走了太多弯路
说实话,在日志处理这件事上,我被“知识陷阱”困了很久。
因为我太熟悉命令行了,grep、rg、awk 玩得飞起,所以过去很长一段时间,我都固执地认为这就是分析日志的“正统”方式。但现实经常打脸:当日志散落在不同服务器、不同路径下时,我得开无数个终端窗口跳来跳去,查个链路问题跟查案一样。
更惨的是,以前公司不给硬件资源,我根本不敢想 Elasticsearch 这种“吞金兽”。为了解决查询问题,我还自己折腾过一套特原始的方案:写脚本去 OSS 上拉压缩包,下载、解压、再用 rg 扫。还能只查找固定时间短的日志,使用者必须先在 GM 后台上查询到用户的登录记录,再根据日期查询具体时间的日志。
后来入职新公司,我这套“土法炼钢”的操作甚至被同事吐槽过:“你怎么还在当原始人?我们早都用 Grafana 查了。”
直到最近,我硬着头皮自己试着搭了一套 Grafana + Loki + Promtail,真的感觉推开了新世界的大门。那种震撼感在于:我只花了不到三十分钟部署,那种多机协同、可视化检索的爽感,瞬间就秒杀了过去几年的肉搏操作。
现在回头看,天天蹲在黑框框里人肉搜索,确实像个原始人。这篇文章就记录一下这个让我“走出石器时代”的工具组合,以及我的安装过程。讲真,以后哪怕项目再小、只有一个服务,我也要把日志接入 Loki。人生苦短,不要把生命浪费在 cd 和 grep 上。
记录安装过程
轻量 Loki + Grafana
Loki 用来收集日志,Grafana 用来查询。这两者不需要安装在同一台机器,网络通畅即可。
- 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
- 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
- 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 之旅
-
打开网页,默认的端口是 3000,我的机器为 http://192.168.200.30:3000
-
默认的账号和密码均为 admin
-
登录会提示修改密码,可以选择跳过,为了安全,最好设置一个新的密码。
-
选择 Explore,点击 Outline 右侧的下拉菜单,选择 Open advanced data source picker->
-
点击 Configure a new data source
-
选择 Loggin & document databases 下面的 Loki
-
配置 URL,也是唯一的必填参数,表示从访问那个机器上的 Loki 日志,我的配置 URL 为 http://192.168.200.30:3100
-
点击 Save & Test,如果显示成功,则可以选择 Loki 并查询日志啦