Vector
Vector 概述
Vector 是 Datadog 推出的一款高性能、轻量级的日志采集代理(Agent)。
它的配置文件结构如下:
# 全局配置
略
# 数据源(Sources)—— 从哪里采集数据
sources:
apache_logs:
type: file
include:
- /var/log/apache2/access.log
read_from: beginning
host_metrics:
type: host_metrics
scrape_interval_secs: 10
demo_logs:
type: demo_logs
format: syslog
interval: 1
# 数据转换(Transforms)—— 对数据进行解析、过滤、采样、重命名等
transforms:
parse_apache:
type: remap
inputs: ["apache_logs"]
source: |
. = parse_apache_log!(.message, "combined")
add_env:
type: remap
inputs: ["parse_apache"]
source: |
.environment = "production"
.host = get_hostname!()
sample_logs:
type: sample
inputs: ["add_env"]
rate: 10 # 只保留 10% 的日志(用于生产降采样)
# 数据输出(Sinks)—— 把数据发到哪里去
sinks:
clickhouse_logs:
type: clickhouse
inputs: ["sample_logs", "parse_apache"]
endpoint: https://clickhouse.example.com:8443
database: logs
table: apache_access
auth:
strategy: basic
user: vector
password: "${CLICKHOUSE_PASSWORD}"
compression: gzip
batch:
max_bytes: 10485760 # 10MB
prometheus_exporter:
type: prometheus_exporter
inputs: ["host_metrics"]
address: 0.0.0.0:9598
console_debug:
type: console
inputs: ["add_env"]
encoding: json全局配置
# ==================== Vector 全局配置 ====================
data_dir: "/var/lib/vector/" # 【必须】Vector 运行时数据的存储目录
# 用来存放 buffer 的磁盘缓存、检查点(checkpoints)、
# internal metrics 的 SQLite 数据库等
# 推荐使用独立的分区或磁盘,权限建议 0700
# 默认值:"/var/lib/vector"(Linux)或系统临时目录
api: # 【可选】开启 Vector 内置的 HTTP API(用于健康检查、指标暴露、调试等)
enabled: true # 是否开启 API 服务
address: "0.0.0.0:8686" # 监听地址和端口,默认 127.0.0.1:8686
playground: true # 是否开启交互式 GraphQL Playground(调试用,生产建议关闭)
healthchecks: # 【可选】健康检查相关配置
enabled: true # 是否启用 /health 端点返回 200(所有组件正常时)
require_healthy: false # 启动时如果有组件不健康是否直接退出(常用于容器编排)
log_level: "info" # 【可选】全局日志级别,可选:off, error, warn, info, debug, trace
# 也可以通过环境变量 VECTOR_LOG 覆盖
# ------------------- 时区与时间处理 -------------------
time_zone: "UTC" # 【可选】事件时间戳解析/格式化使用的时区
# 可选值:Local(本地时区)或 IANA 时区名(如 "Asia/Shanghai")
# 默认:Local
# ------------------- 内部指标相关 -------------------
internal_metrics: # 【可选】Vector 自带的 Prometheus 指标暴露配置
enabled: true
address: "0.0.0.0:9598" # #指标暴露端口(与 api 不同端口)
scrape_interval_secs: 5 # 指标采集间隔,默认 5s
# ------------------- Buffer(缓冲)全局默认 -------------------
buffer: # 【可选】当 sources/transforms/sinks 没有单独配置 buffer 时使用的默认值
type: "memory" # 默认缓冲类型:memory | disk
max_events: 500 # memory 模式下最大事件数
when_full: "block" # 缓冲满时的行为:block(阻塞) | drop_newest(丢弃最新)
# disk 缓冲示例(如果想全局默认用磁盘缓冲可以这样写):
# buffer:
# type: "disk"
# max_size: 268435456 # 256MB(字节)
# when_full: "block"
# ------------------- 其他高级全局配置 -------------------
graceful_shutdown_timeout_secs: 60 # 【可选】收到 SIGTERM 后最多等待多少秒让缓冲刷完,默认 60s
enrichment_tables: # 【可选】全局定义 enrichment tables(类似查找表),可在 transform 中引用
file:
ip_to_region:
type: "file"
file: "/etc/vector/enrichment/ip_to_region.csv"
format: "csv"
# ------------------- 实验性/不常用 -------------------
# enterprise: # 如果你使用 Vector Enterprise 版才需要
# enabled: true
# api_key: "xxxxxx"
# ------------------- 结束 -------------------
# sources / transforms / sinks 放在这个配置文件的其他位置或单独文件数据源(Sources)配置
https://vector.dev/docs/reference/configuration/sources/
常见数据源类型:
| 类型 | 用途 | 典型场景 |
|---|---|---|
| kubernetes_logs | 采集 Kubernetes 所有容器日志(推荐) | K8s 集群日志采集(DaemonSet 模式) |
| host_metrics | 采集主机 CPU/内存/磁盘/网络/负载等指标 | 所有节点通用指标 |
| internal_metrics | Vector Agent 自身运行指标 | 监控 Vector 健康、吞吐、延迟 |
| file | 通用文件日志采集 | Nginx、Apache、自定义应用日志 |
| journald | 采集 systemd-journal 日志 | Linux 系统服务日志 |
| kafka | 从 Kafka 消费日志或指标 | 日志中转管道、解耦架构 |
| vector | Vector → Vector 之间传输(V2 协议) | Edge → Central 多层采集架构 |
| syslog | 接收传统 Syslog(UDP/TCP/TLS) | 网络设备、防火墙、旧系统 |
| statsd | 接收 StatsD 协议指标 | 应用自定义指标 |
| prometheus_scrape | 主动抓取 Prometheus Exporter | Node Exporter、cAdvisor、Java JMX |
| docker_logs | 直接读取 Docker daemon 日志(旧版) | 仍使用 Docker 而非 containerd 的环境 |
| splunk_hec | 接收 Splunk HEC 协议日志 | 兼容旧 Splunk 转发器 |
Kubernetes logs
kubernetes_logs 源是 Vector 用于从 Kubernetes 节点采集容器日志的核心组件。它通过读取 /var/log/pods 下的 Pod 日志文件,并从 Kubernetes API 自动丰富元数据(如 Pod 名称、命名空间、标签等)。以下是一个完整的 YAML 配置代码块,涵盖所有主要参数。
参考文档:https://vector.dev/docs/reference/configuration/sources/kubernetes_logs/
sources:
k8s_logs: # 源 ID,可自定义
type: kubernetes_logs # 必须指定为 kubernetes_logs 类型,用于 K8s 日志采集
# 核心路径和文件处理
include_paths_glob_patterns: # 包含的日志文件路径模式(glob 语法),默认 ["**/*"],建议自定义以匹配特定 Pod
- "/var/log/pods/*/*/*.log" # 示例:匹配所有 Pod 日志文件
exclude_paths_glob_patterns: # 排除的路径模式,默认 ["**/*.gz", "**/*.tmp"],用于跳过压缩或临时文件
- "**/*.gz" # 排除 gzip 文件
- "**/*.tmp" # 排除临时文件
fingerprint_lines: 1 # 生成文件指纹时读取的行数,默认 1,用于唯一标识日志文件,避免重复读取
max_line_bytes: 32768 # 单行最大字节数(合并前),超过则丢弃,默认 32768(32KB),生产中可调至 1MB 以处理大日志
max_merged_line_bytes: 1048576 # 合并部分行后的最大字节数,无默认(需手动设置),用于处理多行日志如栈追踪
max_read_bytes: 2048 # 单文件读取最大字节数(非 oldest_first 模式),默认 2048,调高以提高吞吐但增加内存
oldest_first: true # 优先读取最旧文件,默认 true,适合顺序处理历史日志;设为 false 以平衡多文件读取
read_from: beginning # 从文件开头(beginning)或结尾(end)开始读取,默认 beginning,生产中用 end 以实时采集
rotate_wait_secs: 9223372036854776000 # 日志文件轮转后保持打开句柄的时间(秒),默认极大值(无限制),设为 30 以快速释放资源
glob_minimum_cooldown_ms: 60000 # 文件系统轮询间隔(ms),默认 60000(1 分钟),降低以检测快速轮转文件,但增加 CPU 开销
ignore_older_secs: 86400 # 忽略超过此秒数的未修改文件,默认无,设为 86400(1 天)以跳过旧日志
# 部分行合并(针对 K8s CRI 分割的多行日志)
auto_partial_merge: true # 自动合并部分事件,默认 true,启用以处理 JSON 或多行日志;设为 false 需用 transform 手动合并
# Kubernetes 元数据丰富
pod_annotation_fields: # Pod 元数据字段映射,无默认,配置要富集的字段路径
pod_name: ".kubernetes.pod_name" # Pod 名称字段路径,默认如此,可设为 "" 禁用
pod_namespace: ".kubernetes.pod_namespace" # 命名空间字段
pod_node_name: ".kubernetes.pod_node_name" # 节点名称
pod_uid: ".kubernetes.pod_uid" # Pod UID
pod_owner: ".kubernetes.pod_owner" # Pod 所有者引用
pod_ip: ".kubernetes.pod_ip" # Pod IPv4 地址
pod_ips: ".kubernetes.pod_ips" # Pod IP 列表(IPv4/IPv6)
container_name: ".kubernetes.container_name" # 容器名称
container_image: ".kubernetes.container_image" # 容器镜像
container_image_id: ".kubernetes.container_image_id" # 容器镜像 ID
container_id: ".kubernetes.container_id" # 容器 ID
pod_labels: ".kubernetes.pod_labels" # Pod 标签
pod_annotations: ".kubernetes.pod_annotations" # Pod 注解
namespace_annotation_fields: # 命名空间元数据
namespace_labels: ".kubernetes.namespace_labels" # 命名空间标签
node_annotation_fields: # 节点元数据
node_labels: ".kubernetes.node_labels" # 节点标签
# 过滤和选择器(使用 K8s Label/Field Selector 语法)
extra_label_selector: "app!=vector" # Pod 标签过滤器,默认无,示例:排除 app=vector 的 Pod
extra_namespace_label_selector: "kubernetes.io/metadata.name!=kube-system" # 命名空间标签过滤器,默认无,示例:排除系统命名空间
extra_field_selector: "metadata.name!=exclude-pod" # Pod 字段过滤器,默认无,示例:排除特定 Pod 名称
# API 和缓存
kube_config_file: "" # kubeconfig 文件路径,默认空(使用 in-cluster 配置),集群外部署时指定
use_apiserver_cache: false # 启用 API 请求缓存,默认 false,生产中设为 true 以减少 API 负载
delay_deletion_ms: 60000 # Pod 删除后延迟移除缓存(ms),默认 60000(1 分钟),用于捕获崩溃日志
# 持久化和时间戳
data_dir: "/var/lib/vector/state" # 检查点目录,默认全局 data_dir,必须可写,用于恢复读取位置
ingestion_timestamp_field: ".ingest_timestamp" # 摄入时间戳字段,默认无,用于延迟追踪
timezone: "local" # 时区,默认 local,使用 IANA 如 "Asia/Shanghai"
# 内部指标(可选)
internal_metrics: # 内部指标配置,默认无
include_file_tag: false # 在指标中包含 "file" 标签,默认 false,避免高基数数据转换(Transforms)配置
常见数据转换方式:
| 类型 | 用途 | 关键配置示例 |
|---|---|---|
| remap | 最强大的 VRL(Vector Remap Language)转换 | source: ‘.status = to_int!(.status)’ |
| lua | 写复杂 Lua 脚本 | source: 自定义函数 |
| filter | 条件过滤 | condition: ‘.level == “error”’ |
| sample | 采样(生产环境必备) | rate: 10(保留10%) |
| reduce | 合并多条事件成一条(如会话化) | expires: 30s, group_by: [“user_id”] |
| json_parser | 解析 JSON 日志 | — |
| regex_parser | 正则解析 | regex: ‘(?P |
| add_fields | 添加静态字段 | fields.env: “prod” |
| anonymize | 脱敏 IP、手机号等 | fields: [“client_ip”], method: sha256 |
数据输出(Sinks)配置
https://vector.dev/docs/reference/configuration/sinks/
常见数据输出目标:
| 类型 | 目标系统 | 备注 |
|---|---|---|
| loki | Grafana Loki | 标签模型,成本最低,K8s 最常用 |
| clickhouse | ClickHouse | 超高性能写入查询,推荐首选 |
| elasticsearch | Elasticsearch / OpenSearch | 传统搜索方案,生态最全 |
| kafka | Kafka | 日志中转管道,大厂标配 |
| aws_s3 | AWS S3 / MinIO | 冷存储、归档、合规留存 |
| prometheus_remote_write | Prometheus/Cortex/Thanos/Mimir | 指标远程写入 |
| datadog_logs | Datadog | 直接发 Datadog,无需额外存储 |
| splunk_hec | Splunk | HEC 方式接入 |
| humio | Humio / ChaosSearch | 新一代日志平台 |
| console | 标准输出 | 本地调试、测试必备 |
loki
https://vector.dev/docs/reference/configuration/sinks/loki/
console
- 可使用
kubectl logs -f ds/vector -n monitoring查看输出
sinks:
# 方案A:最快最直观,直接打印到 Vector Pod 的 stdout
console_pretty:
type: console
inputs: ["debug_parse"]
encoding:
codec: json
target: stdout # 直接打到 pod 日志里
# 方案B:想看得更舒服,用 text 格式(带颜色)
console_text:
type: console
inputs: ["debug_parse"]
encoding:
codec: text # 纯文本,一行一条
target: stdoutvector top 命令
kubectl exec -n monitoring -it ds/vector -- vector top