Vector 日志采集实战:采集夜莺日志推送 VictoriaLogs 完整教程

巴辉特 2026-01-06 14:11:36

导读

VictoriaLogs 是一款高性能、低成本的时序数据库,广泛应用于监控和日志存储场景。Vector 是一个开源的日志和指标收集工具,支持多种数据源和目标。本文将介绍如何使用 Vector 采集夜莺(Nightingale)日志并推送给 VictoriaLogs,实现高效的日志管理和分析。

为了方便演示,所有模块均采用容器化部署。

本文大纲如下(本文兼顾新手,如果你是经验丰富的用户,也可以直接跳到相关章节):

  • 组件(Vector、VictoriaLogs、Nightingale)简介
  • 环境准备
  • 配置并启动 Nightingale
  • 配置并启动 VictoriaLogs
  • 配置并启动 Vector
  • 验证日志采集效果

Vector 简介

Vector 是高性能的可观测数据采集与处理组件,支持多种输入(文件、容器日志、syslog 等)、转换(VRL/Remap)以及多种输出(HTTP、Kafka、Elasticsearch 等)。

Datadog Vector

本文选择 Vector 作为日志采集器,因为 Vector 是 Rust 编写,相对比较轻量,且性能优异。当然,你也可以选择 Fluent Bit、Filebeat 等其他采集工具,在我的演示场景下无关紧要。

VictoriaLogs 简介

VictoriaMetrics 的指标存储查询能力有目共睹,该公司推出的 VictoriaLogs 则是专门针对日志存储和查询设计,前段时间也推出了集群版本,本文就尝个鲜,用 VictoriaLogs 来存储和查询日志。

Nightingale 简介

Nightingale(夜莺)是一个开源的监控系统,侧重点是做统一的告警引擎以及告警事件的 Pipeline 处理。夜莺可以对接多种数据源,根据用户配置的告警规则进行告警,最新版本也支持了 VictoriaLogs 作为数据源,既可以对 VictoriaLogs 中的日志进行告警。

我们要演示日志采集,自然需要有个源端产生日志,夜莺本身就会产生日志,那就用它来做日志源吧。

环境准备

我是在 Mac 上面启动了一个 Ubuntu 虚拟机,ARM64 架构,安装了 Docker 和 Docker Compose,其他 Linux 发行版也类似。

root@ubuntu:~# uname -a
Linux ubuntu 6.17.8-orbstack-00308-g8f9c941121b1 #1 SMP PREEMPT Thu Nov 20 09:34:02 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux
root@ubuntu:~# docker --version
Docker version 29.1.3, build f52814d

配置并启动 Nightingale

Nightingale 提供了 Docker compose,我们直接下载发布包:

这里我采用最新版本 v8.5.0。下载 tar.gz 并解压缩,进入 docker/compose-bridge 目录,里边可以看到 docker-compose.yml 文件。不过先不要启动,为了测试方便,我要修改一下 Nightingale 的配置文件,把日志输出到某个特定目录,不和 stdout 内容混在一起。

1、修改:etc-nightingale/config.toml,修改 [Log] 部分,指定日志文件路径:

[Log]
# log write dir
Dir = "logs"
# log level: DEBUG INFO WARNING ERROR
Level = "INFO"
# stdout, stderr, file
Output = "file"
# # rotate by time
KeepHours = 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
  • Output 改为 file,表示把日志输出到文件
  • Dir 改为 logs,表示日志文件存放在 logs 目录,实际是容器里的 /app/logs 目录
  • KeepHours 改为 4,表示日志文件保留 4 小时,测试环境,不想保留太多日志

2、修改 docker-compose.yml,把 nightingale 服务的 volumes 部分,挂载 logs 目录到宿主机:

  nightingale:
    image: flashcatcloud/nightingale:latest
    container_name: nightingale
    hostname: nightingale
    restart: always
    environment:
      GIN_MODE: release
      TZ: Asia/Shanghai
      WAIT_HOSTS: mysql:3306, redis:6379
    volumes:
      - ./etc-nightingale:/app/etc
      - ./n9elogs:/app/logs
    networks:
      - nightingale
    ports:
      - "17000:17000"
      - "20090:20090"
    depends_on:
      - mysql
      - redis
      - victoriametrics
    command:
      - /app/n9e

这样,容器内的 /app/logs 目录就映射到宿主机的 n9elogs 目录,方便我们后续用 Vector 采集日志。

3、启动 Nightingale:

docker-compose up -d

4、验证 Nightingale 是否启动成功:

访问 http://<你的服务器IP>:17000,可以看到 Nightingale 的登录界面,说明启动成功。

默认的用户名和密码是 root / root.2020,登录后建议修改密码。为了让 Nightingale 产生日志,我们做两个配置:

4.1、添加数据源

进入 集成中心-数据源,添加一个数据源,数据源类型使用 Prometheus,名称随意,URL 填写 http://victoriametrics:8428,保存。

http://victoriametrics:8428 是 Nightingale 容器内访问 VictoriaMetrics 的地址,刚才的 docker-compose.yml 里已经定义了 victoriametrics 服务。

4.2、创建一个告警规则

告警-规则管理-告警规则 页面,创建一个新的告警规则:

我的告警规则配置如下:

之后,Nightingale 会根据这个规则中的查询语句查询 VictoriaMetrics,产生告警事件。这个过程会产生日志,方便我们后续采集。

4.3、验证日志产出

进入宿主机的 n9elogs 目录,可以看到有日志文件产生:

root@ubuntu:~/qinxiaohui/n9e-v8.5.0/docker/compose-bridge/n9elogs# tail -f INFO.log
2026-01-07 09:46:09.013141 INFO eval/eval.go:152 rule_eval:alert-1-1 finished, duration:9.436121ms

可以看到这个日志格式分成 4 部分:

  • 时间戳:2026-01-07 09:46:09.013141 没有打印时区信息,Vector 采集的时候需要指定时区
  • 日志级别:INFO
  • 位置:eval/eval.go:152
  • 消息:rule_eval:alert-1-1 finished, duration:9.436121ms

回头我们在 Vector 里配置解析规则的时候,需要使用正则提取这些字段。

配置并启动 VictoriaLogs

VictoriaLogs 也可以用容器直接启动:

docker run --name vmlogs -d -it -p 9428:9428 -v ./victoria-logs-data:/victoria-logs-data \
  docker.io/victoriametrics/victoria-logs:v1.43.1 -storageDataPath=victoria-logs-data -retentionPeriod=3d

这里我把数据目录挂载到宿主机的 victoria-logs-data 目录,日志保留 3 天。默认监听端口是 9428。启动后,可以访问 http://<你的服务器IP>:9428,看到 VictoriaLogs 的 Web UI 界面:

进入 vmui,之后可以在 vmui 查询日志。

配置并启动 Vector

Vector 也使用容器启动,为了让 Vector 能够访问 Nightingale 产生日志的目录,我们需要把宿主机的 n9elogs 目录挂载到 Vector 容器内。同时准备相关的解析规则。现在宿主机创建 vector-n9e.yaml 配置文件:

data_dir: "/datadir"

api:
  enabled: true
  address: 0.0.0.0:8686

sources:
  app_logs:
    type: "file"
    include:
      - "/n9elogs/*.log"

transforms:
  parse_log:
    type: "remap"
    inputs:
      - "app_logs"
    source: |
      . |= parse_regex!(.message, r'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) (?P<level>\w+) (?P<source_location>[^ ]+) (?P<message>.+)')
      .timestamp = parse_timestamp(.timestamp, format: "%Y-%m-%d %H:%M:%S.%6f", timezone: "+08:00") ?? now()      

sinks:
  vlogs:
    inputs:
      - parse_log
    type: elasticsearch
    endpoints:
      - http://192.168.139.242:9428/insert/elasticsearch/
    api_version: v8
    compression: gzip
    healthcheck:
      enabled: false
    query:
      _msg_field: message
      _time_field: timestamp
      _stream_fields: host
  • sources.app_logs:指定采集 /n9elogs/*.log 目录下的日志文件,之后启动 Vector 的时候,把宿主机的 n9elogs 目录挂载到容器的 /n9elogs 目录
  • transforms.parse_log:使用 VRL 脚本解析日志内容,提取时间戳、日志级别、位置和消息四个字段,并把时间戳做了 parse,指定了时区为 +08:00
  • sinks.vlogs:指定输出到 VictoriaLogs,使用 Elasticsearch 协议,endpoints 填写 VictoriaLogs 的地址。VictoriaLogs 支持 Elasticsearch 协议,可以直接兼容 Vector 的 Elasticsearch 输出。
  • _msg_field、_time_field、_stream_fields:指定消息字段、时间字段和流字段,这些是 VictoriaLogs 识别日志的重要字段。极为关键。

启动 Vector 容器:

docker run \
  -d \
  -v $PWD/vector-n9e.yaml:/etc/vector/vector.yaml:ro \
  -v $PWD/datadir:/datadir \
  -v /root/qinxiaohui/n9e-v8.5.0/docker/compose-bridge/n9elogs:/n9elogs \
  -p 8686:8686 \
  --name vector \
  timberio/vector:0.52.0-debian

这里把配置文件挂载到容器的 /etc/vector/vector.yaml,数据目录挂载到 /datadir,以及把宿主机的 n9elogs 目录挂载到容器的 /n9elogs 目录。

最终所有容器都启动完成:

root@ubuntu:~/links/vector# docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED        STATUS        PORTS                                                                                              NAMES
13a4d10232cf   victoriametrics/victoria-logs:v1.43.1       "/victoria-logs-prod…"   13 hours ago   Up 13 hours   0.0.0.0:9428->9428/tcp, [::]:9428->9428/tcp                                                        vmlogs
4b697ad2de0d   timberio/vector:0.52.0-debian               "/usr/bin/vector"        21 hours ago   Up 21 hours   0.0.0.0:8686->8686/tcp, [::]:8686->8686/tcp                                                        vector
f75999aeda62   flashcatcloud/categraf:latest               "/entrypoint.sh"         23 hours ago   Up 23 hours                                                                                                      categraf
ccf2ee7e9af9   flashcatcloud/nightingale:latest            "/app/n9e"               23 hours ago   Up 23 hours   0.0.0.0:17000->17000/tcp, [::]:17000->17000/tcp, 0.0.0.0:20090->20090/tcp, [::]:20090->20090/tcp   nightingale
b9ac63d0a71a   redis:6.2                                   "docker-entrypoint.s…"   23 hours ago   Up 23 hours   0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp                                                        redis
de58098082f1   mysql:8                                     "docker-entrypoint.s…"   23 hours ago   Up 23 hours   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp                                             mysql
5a6c10ff23e5   victoriametrics/victoria-metrics:v1.79.12   "/victoria-metrics-p…"   23 hours ago   Up 23 hours   0.0.0.0:8428->8428/tcp, [::]:8428->8428/tcp                                                        victoriametrics

如果你遇到异常,可以查看容器的日志。交给 AI 咨询,AI 会帮你分析日志并给出解决方案(有了大模型,我感觉现在自己强的可怕…)。

验证日志采集效果

访问 VictoriaLogs 的 Web UI,进入 vmui,执行查询语句:

大功告成!

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat
Flashduty
Flashduty