将多台云主机的日志集中管理,资源占用低,部署简单
为什么需要日志系统?
当你有多台云服务器时,分散的日志让排查问题变得困难:
- SSH 每台服务器查看日志效率低下
- 日志分散无法进行统一分析
- 日志丢失没有历史记录可查
本文介绍一套基于 Loki + Promtail 的轻量级日志集中方案:
- 超低资源占用:Agent 仅需 10-30MB 内存
- 部署简单:二进制文件,无需复杂依赖
- 完美集成 Grafana:如果你已有 Prometheus + Grafana,直接复用
方案架构

组件介绍
| 组件 | 作用 | 资源占用 |
|---|---|---|
| Loki | 日志存储和聚合服务 | ~150MB RAM |
| Promtail | 日志采集 Agent | ~20MB RAM |
| Grafana | 日志查询和展示 | 已有 |
部署步骤
第一步:部署 Loki(Homelab 主机)
创建工作目录:
mkdir -p /opt/loki/{config,data}
cd /opt/loki
编写配置文件 config/loki-config.yml:
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
limits_config:
retention_period: 30d
allow_structured_metadata: false
schema_config:
configs:
- from: 2024-01-01
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
使用 Docker Compose 启动:
# docker-compose.yml
version: "3.8"
services:
loki:
image: grafana/loki:3.6.4
container_name: loki
restart: unless-stopped
ports:
- "3100:3100"
volumes:
- ./config/loki-config.yml:/etc/loki/local-config.yaml:ro
- ./data:/loki
command: -config.file=/etc/loki/local-config.yaml
启动服务:
docker-compose up -d
curl http://localhost:3100/ready
# 返回 ready 表示成功
第二步:部署 Promtail(云主机)
下载并安装 Promtail:
VERSION="3.6.4"
wget https://github.com/grafana/loki/releases/download/v${VERSION}/promtail-linux-amd64.zip -O /tmp/promtail.zip
unzip /tmp/promtail.zip -d /tmp/
sudo mv /tmp/promtail-linux-amd64 /usr/local/bin/promtail
sudo chmod +x /usr/local/bin/promtail
创建配置文件 /etc/promtail/config.yml:
server:
http_listen_port: 9080
positions:
filename: /var/lib/promtail/positions.yaml
clients:
- url: http://<你的Loki地址>:3100/loki/api/v1/push
tenant_id: "1"
scrape_configs:
# 系统日志
- job_name: system
static_configs:
- labels:
job: system
hostname: 主机名
__path__: /var/log/messages
# Nginx 访问日志
- job_name: nginx-access
static_configs:
- labels:
job: nginx
type: access
hostname: 主机名
__path__: /var/log/nginx/access.log
- labels:
job: nginx
type: access
hostname: 主机名
__path__: /var/wwwlogs/*.log
# Nginx 错误日志
- job_name: nginx-error
static_configs:
- labels:
job: nginx
type: error
hostname: 主机名
__path__: /var/log/nginx/error.log
# Docker 容器日志
- job_name: docker
static_configs:
- labels:
job: docker
hostname: 主机名
__path__: /var/lib/docker/containers/*/*-json.log
创建 systemd 服务:
sudo tee /etc/systemd/system/promtail.service > /dev/null <<'EOF'
[Unit]
Description=Promtail log agent
After=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable promtail
sudo systemctl start promtail
第三步:配置 Grafana
- 打开 Grafana → Configuration → Data Sources
- 点击 Add data source,选择 Loki
- 配置如下:
- Name: Loki
- URL:
http://loki:3100 - HTTP Headers: 添加
X-Scope-OrgID: 1
- 点击 Save & Test
第四步:查询日志
在 Grafana Explore 页面,使用 LogQL 查询语言:
# 查看所有日志
{job="system"}
# 查看特定主机的日志
{hostname="tokyo"}
# 查看包含错误的日志
{job="nginx"} |= "error"
# 查看状态码非 200 的请求
{job="nginx", type="access"} | json | status != "200"
# 统计日志量
count_over_time({job="system"}[1h])
常见问题
Q: Promtail 不支持 systemd journal 怎么办?
A: 1、使用 /var/log/messages 文件代替,配置方式见上文。
A: 2、使用 docker部署。
Q: 日志文件权限被拒绝?
A: 修改日志文件权限:
chmod 644 /var/log/messages
chmod 644 /var/log/nginx/*.log
Q: Docker 容器日志无法采集?
A: 确保 Promtail 以 root 运行,或修改目录权限。
Q: Loki 返回 401 错误?
A: 在 Grafana 数据源配置中添加 HTTP Header:X-Scope-OrgID: 1

总结
这套方案的优点:
- ✅ 轻量级:Agent 内存占用仅 20MB
- ✅ 简单:配置文件清晰,易于维护
- ✅ 可靠:基于 Grafana 官方技术栈
- ✅ 免费:开源软件,无商业限制
如果你已经使用 Prometheus + Grafana 监控服务器,添加 Loki 作为日志系统是自然而然的选择。
软件版本:Loki 3.6.4 | Promtail 3.6.4
相关链接:
