VictoriaLogs 和 Vector 的使用分享

张开发
2026/4/3 12:16:27 15 分钟阅读
VictoriaLogs 和 Vector 的使用分享
新钛云服已累计为您分享891篇技术干货PART.01victoriaLogs 介绍与对比victoriaLogs 是什么VictoriaLogs是 VictoriaMetrics 体系里的日志数据库目标是把“写入吞吐、存储成本、查询效率、运维复杂度”这四个维度做到更均衡一个服务就能跑起来HTTP 端口默认9428常见的采集侧Vector / FluentBit / Filebeat 等可以直接对接它的写入 API。核心数据模型消息字段_msg时间字段_time流字段stream fields 决定日志如何被分组与存储类似 Loki 的 labels但语义更贴近“分流/分桶”并且在写入时你可以通过 query 参数/headers 显式指定_msg_field哪一个字段是日志正文_time_field哪一个字段是时间戳_stream_fields哪些字段作为 stream fieldsstream fields 不要高基数stream fields 必须“稳定、低基数比如 host / instance / pod / container / service / env 这种。把 trace_id / user_id / ip 之类高基数放进去会制造海量 streams显著增加资源消耗与查询成本。这点后面会直接影响我们怎么设计labels/fields尤其是filepath。什么时候更适合用 victoriaLogsvs Elasticsearch / OpenSearchES 强在生态与全文检索、聚合分析但运维与成本通常更重集群、shard、mapping、冷热分层、性能调优。VictoriaLogs 更像“把日志存起来并快速检索/聚合”强调更简单的落地与更好的性价比尤其是规模上来之后。vs Grafana LokiLoki 是 label chunklabel 设计同样要避免高基数。VictoriaLogs 的 stream fields 也怕高基数但它把“message/time/stream”的概念讲得更清晰且写入 API 的兼容面如 ES bulk / jsonline让你更容易接入。PART.02VictoriaLogs 的搭建Docker 方式启动mkdir -p ./victoria-logs-datadocker run --rm -it \ -p 9428:9428 \ -v ./victoria-logs-data:/victoria-logs-data \ docker.io/victoriametrics/victoria-logs:latest \ -storageDataPathvictoria-logs-data-storageDataPath数据目录默认 victoria-logs-data-httpListenAddr默认 :9428-retentionPeriod日志保留期默认 1w按需改验证查询LogsQL起服务后可以用 /select/logsql/query 直接查curl http://localhost:9428/select/logsql/query \ -d queryerror -d limit10这会返回包含 error 的最新 10 条。你后续常用的 LogsQL 习惯是时间范围_time:5m / _time:1h / _time:1d排除词-kubernetes排序| sort by (_time)取最新 N 条| first 10 by (_time desc)PART.03Vector 介绍与对比Vector 是什么Vector是一个高性能的可观测数据管道把 logs/metrics/traces 从各种 source 收进来经过 transform核心是 VRL再发往各种 sink。它本质是一个单一可执行文件部署和运维路径很“平台友好”。我们本文会用到sourcesjournald从 systemd journal 读日志需要权限filetail 文件日志带 checkpointtransformremap用 VRL 做字段清洗/补齐/路由但也是坑最多的部分sinkelasticsearch发往 VictoriaLogs 的 /insert/elasticsearch/官方推荐路径之一Vector vs Fluent Bit / Fluentd / Logstash / OTel Collectorvs Fluent BitFluent Bit 更“采集器”轻量、插件多但复杂变换要么写 Lua要么链路拆很多 filter。Vector 的强项是VRL写得好非常强写得不好非常痛苦。vs Fluentd / LogstashFluentd/Logstash 生态成熟但运行时更重Ruby/JVM。Vector 更偏“一个 Rust binary 的工程化组件”。vs OpenTelemetry CollectorOTel Collector 适合统一 traces/metrics/logs但日志处理表达力与生态取舍和 Vector 不同。你可以理解为Vector 更像“日志/可观测数据路由器 可编程 transform。PART.04Vector 的搭建安装Linux 常见方式官方提供安装脚本/包管理方式不同发行版略有差异。安装后默认配置路径通常是/etc/vector/vector.yaml基础运维命令校验配置vector validate /etc/vector/vector.yaml强烈建议每次改配置先跑它systemd 管理包安装通常自带 servicesystemctl enable --now vectorsystemctl restart vectorjournalctl -u vector -fVector 也支持通过信号触发 reload 的方式具体以你的部署方式为准。PART.05Vector 的注意事项fail-safe fallibleVRL 是fail-safe的——只要存在潜在运行时错误没被处理编译期就不让你过。这在日志这种“脏数据”有优势但会显著抬高配置难度。建议把 VRL 流程固定成下面 3 种能不用 fallible 函数就不用优先用 exists() / is_nullish() 这类 infallible 的逻辑兜底。本地 REPLvector vrl 可以进交互 REPL先把片段跑通再放进配置。PlaygroundVRL Playground 适合分享/对照输入输出可选加速打开 API 后用 vector tap 抽样观察某个组件的事件流定位字段长什么样。journald 的 include\_units / exclude\_unitsjournald source 默认要能执行 journalctl且运行用户通常需要在 systemd-journal 组里。include_units 的规则里“没带点号的 unit 会自动补 .service”。labels / stream fields 设计——尤其是 filepath这里要区分两个概念Vector 里你随便加字段比如 filepath这是为了后续查询过滤更方便。VictoriaLogs 的_stream_fields是“用来分组存储的关键字段”不能高基数。建议filepath只做普通字段不要进_stream_fieldsk8s/nomad 场景会爆炸式增长。额外做一个低基数的 file_group或 app/component例如把 /var/log/nginx/access.log、/var/log/nginx/error.log 归到 file_groupnginx把 /var/log/myapp/*.log 归到 file_groupmyappstream_fields 推荐起步host,service,env,source,file_group再按场景微调PART.06Vector 部署到 Linux配置步骤下面介绍 Vector 部署到 Linux并发送 journald file 日志到 VictoriaLogs前置确保 Vector 能读 journald# 常见做法把 vector 用户加入 systemd-journal 组sudo usermod -aG systemd-journal vectorsudo systemctl restart vector/etc/vector/vector.yamljournald file → vlogs你只需要改两块1file include 路径2VictoriaLogs 地址endpoints# /etc/vector/vector.yamldata_dir: /var/lib/vector# 可选开启 API方便 vector tap 调试api: enabled: true address: 127.0.0.1:8686sources: s_journald: type: journald # 默认 current_boot_only: true只读本次开机后的日志 # 建议先不写 include_units跑通后再收敛 exclude_matches: _TRANSPORT: - kernel s_file: type: file include: - /var/log/nginx/*.log - /var/log/myapp/*.logtransforms: t_normalize: type: remap inputs: [s_journald, s_file] # drop_on_abort 默认 true这里显式写出来更直观 drop_on_abort: true source: |- # 固定环境标识也可以改成从环境变量注入 .env prod # 来源类型journald / file .source .source_type # 文件路径只做普通字段不进入 stream_fields if .source_type file { .filepath .file } # service 归一化journald 优先取 unit / identifier if .source_type journald { if !is_nullish(._SYSTEMD_UNIT) { .service ._SYSTEMD_UNIT } else if !is_nullish(.SYSLOG_IDENTIFIER) { .service .SYSLOG_IDENTIFIER } else if !is_nullish(._COMM) { .service ._COMM } else { .service unknown } } # file_group把高基数 filepath 收敛成低基数分组用于 stream_fields if .source_type file { if starts_with(.file, /var/log/nginx/) { .service nginx .file_group nginx } else if starts_with(.file, /var/log/myapp/) { .service myapp .file_group myapp } else { .service file .file_group other } } # 防御空 message 直接丢弃避免写入侧出现“missing _msg field”类噪音 if is_nullish(.message) { abort }sinks: vlogs: type: elasticsearch inputs: [t_normalize] endpoints: - http://YOUR_VLOGS_HOST:9428/insert/elasticsearch/ api_version: v8 compression: gzip healthcheck: enabled: false query: _msg_field: message _time_field: timestamp _stream_fields: host,service,env,source,file_group # 初次联调建议打开确认字段与 stream_fields 是否符合预期 # debug: 1这份 sink 的写法是 VictoriaLogs 官方“Vector → VictoriaLogsElasticsearch 协议”推荐配置的同款思路写入地址/insert/elasticsearch/_msg_fieldmessage、_time_fieldtimestamp、_stream_fields...也可以用 HTTP jsonline 的方式写入/insert/jsonline newline_delimited官方也给了模板。启动与验证1. 校验配置vector validate /etc/vector/vector.yaml2. 重启 Vectorsystemctl restart vectorjournalctl -u vector -f3. 制造两种日志journaldlogger -t demo hello from journaldfileecho hello from file /var/log/myapp/app.log4. 在 VictoriaLogs 查curl http://YOUR_VLOGS_HOST:9428/select/logsql/query \ -d queryhello _time:1h -d limit20LogsQL 里 _time:1h、limit 这类用法是最常用的排障入口。常见问题写入侧出现 “missing _msg field”先确认 sink 里 _msg_field 指向的字段确实存在本文用 message如果你在 remap 里改过字段名确保最后还有 messageVictoriaLogs 对 _msg/_time/_stream 的概念解释在 Key Concepts 里值得快速扫一遍。stream 爆炸、写入变慢、查询变慢99% 是 _stream_fields 里塞了高基数字段最常见就是 filepath / trace_id / user_id回到“低基数、稳定”的原则host/service/env/source/(container/pod) 这类。VRL 写不动用 vector vrl REPL / Playground 先把局部片段跑通再粘贴进配置。如有相关问题请在文章后面给小编留言小编安排作者第一时间和您联系为您答疑解惑。推荐阅读

更多文章