Vector是用Rust编写的高性能可观测性数据管道,统一处理日志、指标和追踪数据,性能达Logstash的10倍、内存占用更低,且配置驱动、支持热重载;相比Fluent Bit,其VRL清洗能力更强、插件生态更完善。

Vector 是什么,为什么不用 Logstash 或 Fluent Bit
Vector 不是 Go 写的日志 agent —— 它是 Rust 写的,但和 Go 项目配合极自然:轻量(单二进制 vector)、低资源占用、配置驱动、支持热重载。如果你的 Go 服务用 log 或 zap 输出结构化 JSON 日志,Vector 能直接消费,无需改代码;而 Logstash JVM 开销大,Fluent Bit 插件生态弱,尤其在字段提取、条件过滤、重命名等清洗场景下 Vector 的 remap 和 filter 更直观可靠。
如何让 Go 应用日志被 Vector 正确采集
关键不是“部署 Vector”,而是让 Go 日志输出格式和 Vector 输入能对齐。默认 log 包输出纯文本,Vector 的 file 源无法结构化解析。必须做两件事:
- Go 侧改用结构化日志库,如
zerolog或zap,并确保输出为 JSON 行(每行一个 JSON 对象) - 禁用日志时间戳、调用栈等非结构字段,或统一用
timestamp、level、message等标准 key —— Vector 的parse_json处理器依赖字段名一致性 - 避免在日志中嵌套过深的 map 或 array,Vector 默认不递归解析,
parse_json只展开一层
示例:zerolog.New(os.Stdout).With().Timestamp().Str("service", "api").Logger().Info().Str("path", "/health").Int("status", 200).Msg("request completed") → 输出一行 JSON,Vector 可直接读取。
vector.toml 中清洗日志的关键配置项
清洗逻辑集中在 transforms 阶段,不是靠写 Go 插件,而是用 Vector 原生 VRL(Vector Remap Language)。常见需求对应配置如下:
立即学习“go语言免费学习笔记(深入)”;
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 过滤 debug 日志:
if .level == "debug" { abort } - 提取 URL 路径:
.path = parse_regex(.message, r'(?P<path>/[^\s]+)')?.path ?? ""</path> - 标准化 level 字段:
.level = switch .level { "INFO" => "info", "ERROR" => "error", default => "unknown" } - 删除敏感字段:
del(.password); del(.token) - 添加服务标签:
.host = get_env("HOSTNAME"); .env = get_env("ENV")
注意:remap 是最常用 transform 类型,但字段引用必须带点前缀(如 .level),否则会被当作字面量字符串;abort 终止当前事件,比 drop 更早生效。
如何在容器或 systemd 中可靠运行 Vector
Vector 本身无守护进程模式,靠外部进程管理。K8s 场景下直接用 DaemonSet + hostPath 挂载日志目录;宿主机部署时建议用 systemd,但要注意两点:
-
Restart=on-failure必须配,否则配置写错导致崩溃后不会自启 -
ExecStart要加--config-dir /etc/vector,而不是只给单个 toml 文件 —— Vector 会自动合并目录下所有*.toml,方便按环境拆分输入/输出配置 - 权限问题常被忽略:如果 Go 应用日志写在
/var/log/myapp/,vector 用户需有读权限,要么改日志文件 umask,要么在 systemd unit 中设User=vector并加SupplementaryGroups=adm
验证是否生效?执行 vector top 查看实时事件吞吐,或用 vector test --config /etc/vector/vector.toml 检查语法和连接性 —— 这步漏掉,上线后才发现 Kafka 认证失败或 Elasticsearch index 不存在,就只能回滚。
真正卡住人的从来不是 Vector 语法,而是 Go 日志输出格式和 Vector 输入解析之间的那一层隐式契约:JSON 行必须合法、字段名要一致、时间戳得是 RFC3339。没对齐,后面所有清洗规则都是空转。

















