VictoriaLogs + Alloy Docker 版部署
前置说明
如果你还没做 MongoDB 日志切割,请先看 MongoDB 日志切割。 Docker 版已经内置 Grafana 和慢查询面板,部署完成后可直接使用。
前提条件
- 已安装
docker - 已安装
docker-compose
部署 VictoriaLogs + Grafana
-
下载镜像
- 服务器支持访问互联网
- 服务器不支持访问互联网
docker pull registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-monitor-victorialogs-grafana-amd64:1.1.0# 离线镜像包文件下载链接,下载完成后上传到部署服务器https://pdpublic.mingdao.com/private-deployment/offline/common/hap-monitor-victorialogs-grafana-amd64_1.1.0.tar.gz# 在服务器上通过 docker load -i 命令加载离线镜像docker load -i hap-monitor-victorialogs-grafana-amd64_1.1.0.tar.gz -
创建配置文件与数据目录
mkdir -p /usr/local/victoria-logs-linuxmkdir -p /data/victorialogsmkdir -p /data/grafana -
创建配置文件
cat > /usr/local/victoria-logs-linux/hap-monitor-logs.yaml << 'EOF'services:hap-monitor-logs:image: registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-monitor-victorialogs-grafana-amd64:1.1.0container_name: hap-monitor-logsrestart: alwaysports:# VictoriaLogs API- "9428:9428"# Grafana- "3000:3000"# 持久化volumes:# VictoriaLogs 数据目录- /data/victorialogs:/data/victorialogs# Grafana 数据目录- /data/grafana:/usr/local/grafana/dataenvironment:# VictoriaLogs HTTP Basic Auth;Alloy 写入时使用同一账号(生产环境必改)MONITOR_AUTH_USERNAME: myuserMONITOR_AUTH_PASSWORD: mypassword# 外部访问 URL(反向代理/子路径时修改)GRAFANA_SERVER_ROOT_URL: "%(protocol)s://%(domain)s:%(http_port)s/privatedeploy/mdy/monitor/victorialogs-grafana/"# 与 GRAFANA_SERVER_ROOT_URL 联动:URL 含子路径为 true,根路径为 falseGRAFANA_SERVER_SERVE_FROM_SUB_PATH: "true"# Grafana管理员账号(生产环境必改)GRAFANA_ADMIN_USER: adminGRAFANA_ADMIN_PASSWORD: admin@123456# 资源限制mem_limit: 3gmemswap_limit: 3gcpus: 2.0ulimits:nofile:soft: 102400hard: 102400# 日志logging:driver: json-fileoptions:max-size: "100m"max-file: "3"EOF
启停服务
# 启动
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml up -d
# 停止
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml down
# 查看状态
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml ps
# 查看日志
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml logs
变量说明
以下变量均支持通过 Compose 的 environment 覆盖。标记为“Compose 已省略”的变量由
启动脚本提供默认值,只有需要调整默认行为时才需要显式配置。
认证与服务模式
| 变量 | Compose 状态 | 默认值 | 说明 | 支持版本 |
|---|---|---|---|---|
MONITOR_AUTH_USERNAME / MONITOR_AUTH_PASSWORD | 保留,生产环境必改 | myuser / mypassword | VictoriaLogs 对外 Basic Auth 认证信息,同时供 Alloy 和 Grafana 数据源使用。 | 1.1.0+ |
MONITOR_SERVICES | Compose 已省略 | all | all 启动 VictoriaLogs 和 Grafana;victorialogs 或 grafana 可单独启动;未配置或为空时按 all 处理。 | 1.1.0+ |
Grafana
| 变量 | Compose 状态 | 默认值 | 说明 | 支持版本 |
|---|---|---|---|---|
GRAFANA_ADMIN_USER / GRAFANA_ADMIN_PASSWORD | 保留,必须修改 | admin / admin@123456 | Grafana 管理员账号和密码。 | 1.0.0+ |
GRAFANA_SERVER_ROOT_URL | 保留,按部署方式修改 | %(protocol)s://%(domain)s:%(http_port)s/privatedeploy/mdy/monitor/victorialogs-grafana/ | Grafana 对外访问地址。使用反向代理或子路径时,填写实际外部地址。 | 1.0.0+ |
GRAFANA_SERVER_SERVE_FROM_SUB_PATH | 保留,需与 ROOT_URL 联动 | true | GRAFANA_SERVER_ROOT_URL 含子路径时设为 true;根路径访问时设为 false。 | 1.0.0+ |
GRAFANA_ALLOW_UNSIGNED_PLUGINS | Compose 已省略 | victoriametrics-logs-datasource | 启动脚本默认允许当前插件加载,通常无需修改;插件名称变化时再覆盖。 | 1.0.0+ |
GRAFANA_VL_DATASOURCE_URL | Compose 已省略 | http://127.0.0.1:9428 | Grafana 访问 VictoriaLogs 的地址。使用 MONITOR_SERVICES=grafana 时必须改为外部 VictoriaLogs 地址。 | 1.0.0+ |
运行环境与存储
| 变量 | Compose 状态 | 默认值 | 说明 | 支持版本 |
|---|---|---|---|---|
TZ | Compose 已省略 | Asia/Shanghai | 容器时区。由启动脚本设置,必要时可通过 Compose 覆盖。 | 1.0.0+ |
GOMEMLIMIT | Compose 已省略 | 2GiB | Go 运行时内存上限。建议不超过 Compose 的 mem_limit。 | 1.0.0+ |
VL_STORAGE_DATA_PATH | Compose 已省略 | /data/victorialogs | VictoriaLogs 数据目录。修改后必须同步修改 Compose 的 volumes 映射。 | 1.0.0+ |
VL_HTTP_LISTEN_ADDR | Compose 已省略 | :9428 | VictoriaLogs HTTP 监听地址。修改端口后必须同步修改 ports 和 Alloy 写入地址。 | 1.0.0+ |
保留策略、并发与查询
| 变量 | Compose 状态 | 默认值 | 说明 | 支持版本 |
|---|---|---|---|---|
VL_RETENTION_PERIOD | Compose 已省略 | 30d | 日志最长保留时间。超过期限的数据会被清理。 | 1.0.0+ |
VL_RETENTION_DISK_USAGE | Compose 已省略 | 50GiB | VictoriaLogs 数据目录允许使用的最大磁盘空间;与时间保留策略同时生效。 | 1.0.0+ |
VL_MEMORY_ALLOWED_PERCENT | Compose 已省略 | 2 | VictoriaLogs 内存使用比例参数,单位为百分比。 | 1.0.0+ |
VL_MAX_CONCURRENT_INSERTS | Compose 已省略 | 4 | 最大并发写入请求数。调高后会增加 CPU、内存和磁盘压力。 | 1.0.0+ |
VL_MAX_CONCURRENT_REQUESTS | Compose 已省略 | 2 | 最大并发查询请求数。超过后进入等待队列。 | 1.0.0+ |
VL_SEARCH_MAX_QUERY_DURATION | Compose 已省略 | 30s | 单次查询最长执行时间,超时后终止查询。 | 1.0.0+ |
VL_SEARCH_MAX_QUERY_TIMERANGE | Compose 已省略 | 24h | 单次查询允许的最大时间范围。 | 1.0.0+ |
VL_SEARCH_MAX_QUEUE_DURATION | Compose 已省略 | 5s | 查询在并发队列中的最长等待时间。 | 1.0.0+ |
VL_SEARCH_LOG_SLOW_QUERY_DURATION | Compose 已省略 | 3s | 查询耗时达到该值时记录慢查询日志。 | 1.0.0+ |
日志写入与日志级别
| 变量 | Compose 状态 | 默认值 | 说明 | 支持版本 |
|---|---|---|---|---|
VL_INSERT_MAX_LINE_SIZE_BYTES | Compose 已省略 | 262144 | 单条日志最大字节数,即 256 KiB;超出后拒绝写入 。 | 1.0.0+ |
VL_INSERT_MAX_FIELDS_PER_LINE | Compose 已省略 | 300 | 单条日志允许的最大字段数。 | 1.0.0+ |
VL_SYSLOG_EXTRA_FIELDS_TCP | Compose 已省略 | {"job":"rsyslog"} | TCP Syslog 写入时附加的 JSON 字段。 | 1.0.0+ |
VL_LOGGER_LEVEL | Compose 已省略 | INFO | VictoriaLogs 日志级别。常用值:DEBUG、INFO、WARN、ERROR。 | 1.0.0+ |
服务模式说明:
MONITOR_SERVICES=all:启动 VictoriaLogs 和 Grafana,适用于默认部署方式。MONITOR_SERVICES=grafana:仅启动 Grafana,必须将GRAFANA_VL_DATASOURCE_URL配置为外部 VictoriaLogs 地址。MONITOR_SERVICES=victorialogs:仅启动 VictoriaLogs,不启动 Grafana。
部署日志采集器 Alloy
注意事项
Alloy 需要部署在每一台 MongoDB 节点上,直接读取本机的 mongodb.log
并把慢查询日志推送到 VictoriaLogs 。每个节点都要单独部署一份,采集本机日志。
注意事项:
VICTORIALOGS_IP:victorialogs 服务地址,需根据实际情况修改。MONITOR_AUTH_USERNAME:VictoriaLogs 认证用户,需根据实际情况修改。MONITOR_AUTH_PASSWORD:VictoriaLogs 认证密码,需根据实际情况修改。VICTORIALOGS_PORT:victorialogs 服务端口,默认 9428。MONGODB_SERVER_IP:MongoDB 所在服务器 IP,用于生成mongodb-<IP>唯一标识。- 日志挂载路径
/data/logs/mongodb/mongodb.log:/data/logs/mongodb/mongodb.log:ro中,冒号左侧是服务器上的 MongoDB 日志文件,需根据实际情况修改。
-
下载 Alloy 镜像
- 服务器支持访问互联网
- 服务器不支持访问互联网
docker pull registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-alloy-vlogs-mongodb-amd64:1.0.0# 离线镜像包文件下载链接,下载完成后上传到部署服务器https://pdpublic.mingdao.com/private-deployment/offline/common/hap-alloy-vlogs-mongodb-amd64_1.0.0.tar.gz# 在服务器上通过 docker load -i 命令加载离线镜像docker load -i hap-alloy-vlogs-mongodb-amd64_1.0.0.tar.gz -
创建配置文件与数据目录
mkdir -p /usr/local/alloy-vlogs/ /data/alloy-data -
创建 Alloy 配置文件
cat > /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml << 'EOF'services:alloy-vlogs-mongodb:image: registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-alloy-vlogs-mongodb-amd64:1.0.0container_name: alloy-vlogs-mongodbrestart: alwaysenvironment:# VictoriaLogs 地址VICTORIALOGS_IP: 10.206.0.5# VictoriaLogs 端口VICTORIALOGS_PORT: 9428# 使用 VictoriaLogs 认证信息MONITOR_AUTH_USERNAME: myuserMONITOR_AUTH_PASSWORD: mypassword# MongoDB 所在服务器 IP,用于生成 mongodb-<IP> 唯一标识MONGODB_SERVER_IP: 10.206.0.8volumes:- /data/logs/mongodb/mongodb.log:/data/logs/mongodb/mongodb.log:ro- /etc/hostname:/host/etc/hostname:ro- /etc/machine-id:/host/etc/machine-id:ro- /data/alloy-data:/usr/local/alloy-vlogs/datadeploy:resources:limits:cpus: '1'memory: 1GEOF
启停服务
# 启动
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml up -d
# 停止
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml down
# 查看状态
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml ps
# 查看日志
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml logs
变量说明
部署时需要确认下面 5 项:
| 变量 | 配置状态 | 默认值 | 示例 | 用途 |
|---|---|---|---|---|
VICTORIALOGS_IP | 需要确认 | hap-monitor-logs | 10.206.0.5 | VictoriaLogs 地址;与 VictoriaLogs 使用同一 Compose 时可填写服务名。 |
VICTORIALOGS_PORT | 需要确认 | 9428 | 9428 | VictoriaLogs HTTP 端口。 |
MONITOR_AUTH_USERNAME | 必填 | 无 | myuser | VictoriaLogs 认证用户名。 |
MONITOR_AUTH_PASSWORD | 必填 | 无 | mypassword | VictoriaLogs 认证密码,生产环境必须修改。 |
MONGODB_SERVER_IP | 建议填写 | 使用 machine-id 自动生成 | 10.206.0.8 | 生成唯一任务名,例如 mongodb-10.206.0.8。 |
- 如果不填写
MONGODB_SERVER_IP或MONGODB_INSTANCE_ID,Compose 会只读挂载宿主机/etc/machine-id,自动生成类似mongodb-a1b2c3d4e5f6的名称。虚拟机或服务器克隆后, 请确认machine-id已重新生成。
可选变量和默认值:
| 变量 | 是否填写 | 默认值 | 用途 |
|---|---|---|---|
MONGODB_LOG_PATH | 否 | /data/logs/mongodb/mongodb.log | 容器内 MongoDB 日志路径,需与挂载目标一致。 |
MONGODB_JOB_NAME | 否 | 自动生成 | 手工指定唯一任务名时使用,建议以 mongodb- 开头。 |
MONGODB_INSTANCE_ID | 否 | 空 | 没有服务器 IP 时,指定稳定的实例标识。 |
MONGODB_HOSTNAME | 否 | 自动读取宿主机 hostname | 仅用于展示,不作为唯一标识。 |
VICTORIALOGS_PUSH_URL | 不填写 | 自动生成 | Alloy 写入 VictoriaLogs 的地址。 |
变量生效顺序为:宿主机环境变量 > --env-file 文件 > Compose 文件 > 启动脚本默认值。
未设置服务器 IP、实例标识和任务名时,启动脚本使用宿主机 /etc/machine-id
前 12 位生成唯一任务名。
镜像内置 Alloy 参数:
| 项目 | 值 | 说明 |
|---|---|---|
| 配置文件 | /usr/local/alloy-vlogs/config.alloy | 读取 MongoDB 日志、过滤慢查询并写入 VictoriaLogs。 |
| 程序路径 | /usr/local/alloy-vlogs/bin/alloy | Alloy 可执行文件路径。 |
| HTTP 监听地址 | 0.0.0.0:9081 | 管理和健康检查端口,Compose 默认不暴露。 |
| 状态目录 | /usr/local/alloy-vlogs/data | 保存文件读取位置,建议挂载宿主机目录持久化。 |
生成测试慢查询日志
说明
- 以下命令仅用于测试采集链路,会向
/data/logs/mongodb/mongodb.log追加 15 条耗时大于 1000ms 的 MongoDB 慢查询日志。日志中 的表 ID、数据库名、UUID 和签名均为脱敏示例;每条日志写入时使用当前 UTC 时间。 /data/logs/mongodb/mongodb.log注意改为实际的日志路径
- Linux 基础命令版
- Python 版
不依赖 Python,使用 Bash、date 和 cat。命令会随机生成 3 个表名,共写入 15 条日志;
每个表写入 5 条,每次写入间隔 1 秒,确保同一 ns 有多个时间点。
点击查看 Linux 测试脚本
sudo bash <<'BASH'
set -eu
LOG_FILE=/data/logs/mongodb/mongodb.log
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
DURATIONS=(1250 2387 43146 1680 9021 1380 2670 5120 1940 8030 1560 3290 6840 2210 9470)
TABLE_IDS=(
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
)
for i in "${!DURATIONS[@]}"; do
now="$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)"
epoch="$(date +%s)"
uuid="$(cat /proc/sys/kernel/random/uuid)"
table_id="${TABLE_IDS[$((i % ${#TABLE_IDS[@]}))]}"
duration="${DURATIONS[$i]}"
cat >> "$LOG_FILE" <<EOF
{"t":{"\$date":"$now"},"s":"I","c":"COMMAND","id":51803,"ctx":"conn$((100+i+1))","msg":"Slow query","attr":{"command":{"\$clusterTime":{"clusterTime":{"\$timestamp":{"i":$((i+1)),"t":$epoch}},"signature":{"hash":{"\$binary":{"base64":"REDACTED","subType":"0"}},"keyId":1}},"\$db":"example_db","find":"$table_id","filter":{"status":1,"sys_lock":{"\$ne":true}},"limit":2000,"lsid":{"id":{"\$uuid":"$uuid"}},"sort":{"utime":-1}},"cursorExhausted":true,"docsExamined":1010000,"durationMillis":$duration,"keysExamined":1010000,"nreturned":0,"ns":"example_db.$table_id","numYields":4095,"planCacheKey":"demo$i","planSummary":"IXSCAN { utime: 1 }","protocol":"op_msg","queryHash":"demo_hash_$i","reslen":249,"type":"command"}}
EOF
sleep 1
done
echo "已写入 ${#DURATIONS[@]} 条测试慢查询日志:$LOG_FILE"
BASH
Python 版本同样随机生成 3 个表名,共写入 15 条日志;每个表写入 5 条,每次写入间隔
1 秒,确保同一 ns 有多个时间点。
点击查看 Python 测试脚本
sudo python3 - <<'PY'
import json
import os
import secrets
import time
import uuid
from datetime import datetime, timezone
path = "/data/logs/mongodb/mongodb.log"
os.makedirs(os.path.dirname(path), exist_ok=True)
durations = [1250, 2387, 43146, 1680, 9021, 1380, 2670, 5120, 1940, 8030, 1560, 3290, 6840, 2210, 9470]
tables = ["ws" + secrets.token_hex(12) for _ in range(3)]
with open(path, "a", encoding="utf-8") as stream:
for index, duration in enumerate(durations, 1):
table = tables[(index - 1) % len(tables)]
now = datetime.now(timezone.utc)
epoch = int(now.timestamp())
log = {
"t": {"$date": now.isoformat(timespec="milliseconds").replace("+00:00", "Z")},
"s": "I",
"c": "COMMAND",
"id": 51803,
"ctx": f"conn{100 + index}",
"msg": "Slow query",
"attr": {
"command": {
"$clusterTime": {
"clusterTime": {"$timestamp": {"i": index, "t": epoch}},
"signature": {
"hash": {"$binary": {"base64": "REDACTED", "subType": "0"}},
"keyId": 1,
},
},
"$db": "example_db",
"find": table,
"filter": {"status": 1, "sys_lock": {"$ne": True}},
"limit": 2000,
"lsid": {"id": {"$uuid": str(uuid.uuid4())}},
"sort": {"utime": -1},
},
"cursorExhausted": True,
"docsExamined": 1010000,
"durationMillis": duration,
"keysExamined": 1010000,
"nreturned": 0,
"ns": f"example_db.{table}",
"numYields": 4095,
"planCacheKey": f"demo{index}",
"planSummary": "IXSCAN { utime: 1 }",
"protocol": "op_msg",
"queryHash": f"demo_hash_{index}",
"reslen": 249,
"type": "command",
},
}
stream.write(json.dumps(log, separators=(",", ":")) + "\n")
stream.flush()
time.sleep(1)
print(f"已写入 {len(durations)} 条测试慢查询日志:{path}")
PY
验证结果:
tail -n 5 /data/logs/mongodb/mongodb.log | jq -r '[.t["$date"], .attr.ns, .attr.durationMillis] | @tsv'
代理转发配置 Grafana
注意事项
- 将
192.168.1.10:3000替换为实际的 Grafana 地址和端口。 - 将
hap.domain.com:80替换为实际的外部访问域名和端口,并同步修改server_name。 - 代理子路径需与
GRAFANA_SERVER_ROOT_URL保持一致。
upstream grafana {
server 192.168.1.10:3000;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name hap.domain.com;
access_log /data/logs/weblogs/grafana.log main;
error_log /data/logs/weblogs/grafana.mingdao.net.error.log;
location /privatedeploy/mdy/monitor/victorialogs-grafana/ {
#allow 1.1.1.1;
#deny all;
proxy_hide_header X-Frame-Options;
proxy_set_header X-Frame-Options ALLOWALL;
proxy_set_header Host $http_host;
proxy_pass http://grafana;
proxy_redirect http://localhost:3000 http://hap.domain.com:80/privatedeploy/mdy/monitor/victorialogs-grafana;
}
location /privatedeploy/mdy/monitor/victorialogs-grafana/api/live {
rewrite ^/(.*) /$1 break;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_pass http://grafana;
}
}
访问说明
代理配置好后即可通过以下地址访问 Grafana 页面:
http://hap.domain.com/privatedeploy/mdy/monitor/victorialogs-grafana
- 根据前面配置文件中
GRAFANA_ADMIN_USER和GRAFANA_ADMIN_PASSWORD变量值获取 - 账号:admin
- 密码:admin@123456